如何在iOS 13的导航控制器中初始隐藏搜索栏?

时间:2019-08-20 21:08:47

标签: uikit uisearchbar uisearchcontroller uinavigationitem ios13

在iOS 13中,行为已更改,因此默认情况下,当导航控制器出现时,搜索栏是可见的(将UISearchController分配给navigationItem.searchController时)。某些系统应用程序显示为带有隐藏的搜索栏(您需要向下滑动才能显示它),但是我看不到任何允许此操作的特定属性。如何实现这一点-也许有一些属性或某种方法可以做到这一点?

7 个答案:

答案 0 :(得分:4)

通过实验,我发现,如果您将搜索控制器分配给导航项的时间推迟到viewWillLayoutSubviewsviewDidLayoutSubviews,则搜索控制器将根据需要开始隐藏。但是,如果在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并在UITableViewUICollectionView上获得了初始数据来完成这项工作。如果您最初有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