iOS 13的行为发生了变化,当导航控制器出现时,默认情况下搜索栏是可见的(当将UISearchController
分配给navigationItem.searchController
时)。一些系统应用程序出现时搜索栏被隐藏(需要向下滑动才能显示),但我没有看到任何特定的属性可以允许这样做。怎么实现呢?也许有一些属性或方法可以做到这一点?
iOS 13的行为发生了变化,当导航控制器出现时,默认情况下搜索栏是可见的(当将UISearchController
分配给navigationItem.searchController
时)。一些系统应用程序出现时搜索栏被隐藏(需要向下滑动才能显示),但我没有看到任何特定的属性可以允许这样做。怎么实现呢?也许有一些属性或方法可以做到这一点?
通过实验,我发现如果在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
}
viewWillLayoutSubviews
或 viewDidLayoutSubviews
中无法正常工作,请尝试在 viewDidAppear
中执行。这对我很有效! - Avery Vine若想要开始使用隐藏的 searchBar
,只需在你的表格视图(或集合视图)填充数据后,设置导航项.searchController属性即可。
受到bunnyhero的回答的启发,我将设置UISearchController
在navigationItem
中的代码放在了viewDidAppear
方法中。在iOS 14/15上,这似乎每次都有效。
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if navigationItem.searchController == nil {
navigationItem.searchController = searchController
}
}
编辑:我过于乐观了。在iOS 15.2上,这种方法对我不起作用。我所做的是在重新加载表格/集合视图后移动代码来修复它。
这是对我有效的方法。我有一个UISegmentedControl,当筛选器更改时重新加载tableView。
使用FRC:
guard let count = try? fetchedResultsController.managedObjectContext.count(for: request) else { return }
在tableView.reloadData()之后调用
navigationItem.searchController = count > 20 ? searchController : nil
在设置searchController
之前,应该先获取tableView
的frame。
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
super.scrollViewDidScroll(scrollView)
if !scrollView.frame.isEmpty, navigationItem.searchController == nil {
navigationItem.searchController = searchController
}
}
navigationController?.navigationBar.isTranslucent = false
Swift 5.2 & iOS 13.3.1:
试试这样做,它可以正常工作。
navigationItem.hidesSearchBarWhenScrolling = false