在iOS 13中,行为已更改,因此默认情况下,当导航控制器出现时,搜索栏是可见的(将UISearchController
分配给navigationItem.searchController
时)。某些系统应用程序显示为带有隐藏的搜索栏(您需要向下滑动才能显示它),但是我看不到任何允许此操作的特定属性。如何实现这一点-也许有一些属性或某种方法可以做到这一点?
答案 0 :(得分:4)
通过实验,我发现,如果您将搜索控制器分配给导航项的时间推迟到viewWillLayoutSubviews
或viewDidLayoutSubviews
,则搜索控制器将根据需要开始隐藏。但是,如果在iOS 12或更早版本上执行此操作,则向下滚动时不会显示搜索控制器。
最后,我进行了混乱的版本检查,对我来说很有效:
override func viewDidLoad() {
super.viewDidLoad()
searchController = /* make search controller... */
if #available(iOS 13, *) {
// Attaching the search controller at this time on iOS 13 results in the
// search bar being initially visible, so assign it later
}
else {
navigationItem.searchController = searchController
}
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
navigationItem.searchController = searchController
}
答案 1 :(得分:0)
我发现这可行:
self.searchController.searchBar.hidden = YES;
您需要在适当的时间取消隐藏。
答案 2 :(得分:0)
Swift 5.2和iOS 13.3.1:-
尝试这样。效果很好
navigationItem.hidesSearchBarWhenScrolling = false
答案 3 :(得分:0)
我设法通过在isTransculent
上设置false
navigationBar
并在UITableView
或UICollectionView
上获得了初始数据来完成这项工作。如果您最初有0个单元格,并且在一段时间后(可能是网络调用)触发reloadData
,则SearchBar最初是可见的。因此,如果是这种情况,那么最初要有一个虚拟单元格或类似的单元格,然后再加载数据。
navigationController?.navigationBar.isTranslucent = false
答案 4 :(得分:0)
要以隐藏的searchBar
开始,只需在您的表格视图(或集合视图)填充了navigationItem.searchController
属性 后,数据。
答案 5 :(得分:0)
应该在searchController
获取帧后设置tableView
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
super.scrollViewDidScroll(scrollView)
if !scrollView.frame.isEmpty, navigationItem.searchController == nil {
navigationItem.searchController = searchController
}
}
答案 6 :(得分:0)
这对我有用。我有一个 UISegmentedControl,可以在过滤器更改时重新加载 tableView。
使用 FRC:
guard let count = try? fetchedResultsController.managedObjectContext.count(for: request) else { return }
在 tableView.reloadData() 之后调用
navigationItem.searchController = count > 20 ? searchController : nil