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.
问题是运行此代码时搜索栏不可见.我记录了searchBar
in 的帧值viewDidAppear
,发现它的帧设置为(0,0,0,44),即宽度没有得到解析.
我也尝试了视觉格式字符串,H:|[mySearchBar(>=768)]|
在这种情况下,它searchBar
是可见的并且在它的位置但是没有在方向改变时调整大小,即在景观中也保持768点宽.
我在这做错了什么?应该怎样做才能使所需的布局约束起作用?
我在iPad模拟器iOS 7.1上尝试这个.
我也尝试将搜索栏添加到标题视图中,但它的行为与我的要求不同.
解决了!
我仍然不确定为什么以前的方法不起作用,但我得到了这样的预期结果:
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:
返回满足可视格式字符串中的条件所需的所有约束的数组.