使用自动布局以编程方式将子视图添加到UICollectionView无法正常工作

Abh*_*nav 1 objective-c uisearchbar ios autolayout uicollectionview

我有一个UICollectionViewController故事板设置,它使用流程布局.到目前为止它工作正常,即它的布局和单元格按预期工作.

现在,我正在尝试添加UISearchBar一个子视图UICollectionView.这是我添加搜索栏的方式:

流布局sectionInset设置UIEdgeInsetsMake(44, 0, 0, 0)为为搜索栏腾出空间.

并添加以下代码viewDidLoad:

self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 768.0, 44.0f)];
    // have also tried [[UISearchBar alloc] init] here.
[self.searchBar setTranslatesAutoresizingMaskIntoConstraints:NO];

[self.collectionView addSubview:self.searchBar];

NSDictionary* viewDict = @{@"mySearchBar": self.searchBar};

NSArray* sHorizontal = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[mySearchBar]|"
                                                               options:0
                                                               metrics:nil
                                                                 views:viewDict];


NSArray* sVertical = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[mySearchBar(==44)]"
                                                             options:0
                                                             metrics:nil
                                                               views:viewDict];

[self.collectionView addConstraints:sHorizontal];
[self.collectionView addConstraints:sVertical];
Run Code Online (Sandbox Code Playgroud)

约束非常简单.它的左,右和上边缘searchBar固定在超视图的左,右和上边缘,其高度为44.

问题是运行此代码时搜索栏不可见.我记录了searchBarin 的帧值viewDidAppear,发现它的帧设置为(0,0,0,44),即宽度没有得到解析.

我也尝试了视觉格式字符串,H:|[mySearchBar(>=768)]|在这种情况下,它searchBar是可见的并且在它的位置但是没有在方向改变时调整大小,即在景观中也保持768点宽.

我在这做错了什么?应该怎样做才能使所需的布局约束起作用?

我在iPad模拟器iOS 7.1上尝试这个.

我也尝试将搜索栏添加到标题视图中,但它的行为与我的要求不同.

Abh*_*nav 5

解决了!

我仍然不确定为什么以前的方法不起作用,但我得到了这样的预期结果:

NSDictionary* viewDict = @{@"mySearchBar": self.searchBar, @"myCollView": self.collectionView};

NSArray* sHorizontal = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[mySearchBar(==myCollView)]|"
                                                               options:0
                                                               metrics:nil
                                                                 views:viewDict];


NSArray* sVertical = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[mySearchBar(==44)]"
                                                             options:0
                                                             metrics:nil
                                                               views:viewDict];

[self.collectionView addConstraints:sHorizontal];
[self.collectionView addConstraints:sVertical];
Run Code Online (Sandbox Code Playgroud)

请注意,可视格式字符串H:|[mySearchBar(==myCollView)]|表示搜索栏的宽度应等于集合视图的宽度.集合视图将添加到viewDict字典中myCollView.这正在按预期工作,搜索栏会根据方向更改调整大小.

有几点需要注意,早些时候我也尝试过使用类的constraintWithItem:方法做同样的事情NSLayoutConstraint.虽然api相当容易理解,但它只创建了一个约束.因此,我们必须将其称为所需约束的次数,这可能是乏味的.不仅如此,在我的情况下,用这种方法设置'等宽'约束是崩溃,我无法弄清楚为什么.

另一方面,constraintsWithVisualFormat:返回满足可视格式字符串中的条件所需的所有约束的数组.