我有一个UITableView,我将其标题设置为搜索栏。
tableView.tableHeaderView = searchController.searchBar
所有内容都按计划运行,直到您单击它并且它看起来与tableView分离并跳转到屏幕顶部。 tableView行保持不变。有什么理由在iOS 11而不是iOS 10中这样做吗?
答案 0 :(得分:12)
鼓励在iOS 11上应用新方式显示搜索栏/搜索控制器。 这就是我所做的:
if #available(iOS 11.0, *) {
navigationItem.searchController = searchController
} else {
tableView.tableHeaderView = searchController.searchBar
}
答案 1 :(得分:4)
我关于SO的第一篇文章,我希望我做得对。
我遇到了完全相同的问题,并且很难找到解决方案。但现在我已经设法通过继承UISearchController
来修复它。
此子类有两个属性:
var customDelegate : CustomSearchControllerDelegate!
var searchBarWithCustomSize : UISearchBar!
因此,我现在可以使用自定义searchController中的新属性searchBarWithCustomSize,而不是使用UISearchController的searchBar,如下所示:
tableView.tableHeaderView = customSearchController.searchBarWithCustomSize
这使得搜索栏在激活时表现正常。您还可以使用此searchBarWithCustomSize获得更多自由,例如,您可以根据需要更改其框架,等等。
在我的实现中,我需要代表知道搜索栏文本字段何时被更改,但我想代表的使用取决于您的情况。
答案 2 :(得分:1)
我有完全相同的问题 - 在iOS11上UISearchBar的奇怪跳跃行为,在iOS10上一切都很好。
关于Simon Wang上面的建议 - 我遇到的问题是我没有在UISearchBar
内定义UIViewController
,而是在另一个UITableViewCell
内 - 所以我无权访问navigationItem
,无法以此方式显示我的搜索栏。
无论如何,经过多次试验和错误,我能让事情发挥作用的唯一方法就是完全摧毁UISearchController
及相关代表。
相反,我在Interface Builder中定义UISearchBar
,并根据需要定义其布局约束。然后我使其父类符合UISearchBarDelegate
并执行searchBar.delegate = self
然后我添加了一堆委托方法来捕获搜索栏中的内容更改,并相应地更新我的表结果:
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
filterContentForSearchText(self.searchBar.text!)
}
func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
filterContentForSearchText(self.searchBar.text!)
self.searchBar.resignFirstResponder()
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filterContentForSearchText(self.searchBar.text!)
}
生活再好。 希望这有帮助!
答案 3 :(得分:0)
试试这个:
if (@available(iOS 11, *)){
[searchVC.searchBar addObserver:self forKeyPath:@"frame" options: NSKeyValueObservingOptionNew context:nil];
}else{
[view addSubview:searchVC.searchBar];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
CGRect rect = [change[@"new"] CGRectValue];
if (rect.origin.y == 14) {
CGRect temp = rect;
temp.origin.y = 20;
[self.searchVC.searchBar setValue:@(temp) forKey:@"frame"];
}else if (rect.size.height == 56){
CGRect temp = rect;
temp.size.height = 50;
[self.searchVC.searchBar setValue:@(temp) forKey:@"frame"];
}
}
答案 4 :(得分:0)
试试这个。
if #available(iOS 11.0, *) {
searchBar.heightAnchor.constraint(equalToConstant: 44).isActive = true
}