如下图所示,当我点按搜索字段时,我的UISearchBar
会调整大小。它很好地动画覆盖了导航栏,然后弹出......它缩小了。
UISearchBar
位于UIView
内的tableHeaderView
内。我正在使用UIView
(而不是将UISearchBar
设置为标头),因为我想在标头中添加其他视图。
视图在XIB文件中定义,UISearchBar
锚定到其所有边框。这些限制似乎并不重要;如果我删除它们,会发生同样的问题。
在Reveal中检查视图层次结构会告诉我UIView
的大小合适,UISearchBar
的宽度为1(?!),当发生这种情况时。
作为实验,我将UISearchBar
子类化,并使intrinsicContentSize
返回{320,44}
。有了这个,UISearchBar
显示正确,但是当我按下取消时,我得到以下异常:
*** Assertion failure in -[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2903.23/UIView.m:8540
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. UITableView's implementation of -layoutSubviews needs to call super.'
如果我按代码创建所有内容,它就可以正常工作。
_headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)];
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)];
searchBar.delegate = self;
[_headerView addSubview:searchBar];
_searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
_searchDisplayController.searchResultsDelegate = self;
_searchDisplayController.searchResultsDataSource = self;
_searchDisplayController.delegate = self;
_tableView.tableViewHeader = _headerView;
这里发生了什么?我显然不会再使用笔尖与UISearchBar
一起工作,但我想了解到底发生了什么。
答案 0 :(得分:15)
区别在于搜索栏的translatesAutoresizingMaskIntoConstraints
值。基于XIB的视图默认为NO
,基于代码的视图默认为YES
。显然,搜索控制器假定值为YES,并且在移植搜索栏时不会设置任何显式约束。
在代码中将值设置为YES
应修复它(在本地验证)。
<强>更新强>
如评论中所述,即使使用translatesAutoresizingMaskIntoConstraints = YES
,控制器也不会在取消时将标题视图恢复为原始状态。但似乎有一种解决方法。您可以为标题视图创建一个插座,然后在searchDisplayControllerDidEndSearch
中自行恢复。我做了一个粗略的概念验证(并更新了我的示例项目):
- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller
{
self.tableView.tableHeaderView = self.headerView;
[self.searchBar removeFromSuperview];
self.searchBar.frame = CGRectMake(0, 20, 320, 44);
[self.headerView addSubview:self.searchBar];
}
答案 1 :(得分:1)
以下是@TimothyMoose和@hpique关于设置translatesAutoresizingMaskIntoConstraints = YES(yuck)的内容
在我的代码中,我发现如果我执行以下操作来显示searchDisplayController
self.searchDisplayController.searchBar.translatesAutoresizingMaskIntoConstraints = YES
[self.searchDisplayController setActive:YES animated:YES]
并在关闭searchDisplayController时执行相反的操作,
self.searchDisplayController.searchBar.translatesAutoresizingMaskIntoConstraints = NO
[self.searchDisplayController setActive:NO animated:YES]
然后我的观点保持不变(一切都回到我期待的那样)
如果我 在结束时不打电话 以下一行
self.searchDisplayController.searchBar.translatesAutoresizingMaskIntoConstraints = NO
然后视图搞砸了。
我相信的原因是NSAutoresizingMaskLayoutConstraint断言它们是自我的,因为它们是约束列表中的最后一个,布局引擎制动真实约束以满足不需要的NSAutoresizingMaskLayoutConstraint约束。