我有一个 UICollectionViewController
从 Storyboard设置并使用流布局。到目前为止,它工作正常,即它的布局和单元格按预期工作。
现在,我正在尝试添加 UISearchBar
作为 UICollectionView
的 subview .这就是我添加搜索栏的方式:
流布局的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];
约束非常简单。
searchBar
的左、右和上边缘固定在 super View 的左、右和上边缘,其高度为 44。问题是运行此代码时搜索栏不可见。我记录了
searchBar
的帧值在 viewDidAppear
并发现它的框架设置为 (0, 0, 0, 44) 即宽度没有得到解决。我还尝试了可视格式字符串
H:|[mySearchBar(>=768)]|
在这种情况下 searchBar
是可见的并且在它的位置,但不会在方向变化时调整大小,即在横向上也保持 768 点宽。我在这里做错了什么?应该怎么做才能使所需的布局约束起作用?
我正在 iPad 模拟器 iOS 7.1 上尝试这个。
我也尝试将搜索栏添加到标题 View ,但它的行为与我需要的不同。
最佳答案
解决了!
我仍然不确定为什么以前的方法不起作用,但我得到了这样的预期结果:
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];
注意可视格式字符串
H:|[mySearchBar(==myCollView)]|
这意味着搜索栏的宽度应该等于 Collection View 的宽度。 Collection View 被添加到 viewDict
字典为 myCollView
.这按预期工作,搜索栏会根据方向更改调整大小。需要注意的几点,之前我也使用
constraintWithItem:
尝试了同样的事情。 NSLayoutConstraint
的方法类(class)。虽然 api 相当容易理解,但它只创建一个约束。所以我们必须根据所需的约束数量多次调用它,这可能很乏味。不仅如此,就我而言,用这种方法设置“等宽”约束会崩溃,我不知道为什么。另一方面,
constraintsWithVisualFormat:
返回满足可视格式字符串中的条件所需的所有约束的数组。
关于ios - 以编程方式使用自动布局将 subview 添加到 UICollectionView 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25211280/