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

Iva*_*čin 6 uikit uisearchbar uinavigationitem uisearchcontroller ios13

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

bun*_*ero 6

通过实验,我发现如果您延迟将搜索控制器分配给导航项,直到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
}

Run Code Online (Sandbox Code Playgroud)

  • 这听起来很有希望,我也投了赞成票,但至少对我来说它没有任何效果,所以可能它只在某些情况下有效。 (6认同)
  • 如果它在“viewWillLayoutSubviews”或“viewDidLayoutSubviews”中不起作用,请尝试在“viewDidAppear”中执行此操作。这对我有用! (2认同)

Ely*_*Ely 6

要从隐藏开始,只需在表视图(或集合视图)填充数据searchBar设置navigationItem.searchController属性即可。


Mic*_*rke 0

我发现这有效:

self.searchController.searchBar.hidden = YES;

您需要在适当的时间取消隐藏。