iOS11 SearchController - 从 navigationItem 中移除 SearchBar 会留下损坏的 UI

Posted

技术标签:

【中文标题】iOS11 SearchController - 从 navigationItem 中移除 SearchBar 会留下损坏的 UI【英文标题】:iOS11 SearchController - SearchBar removal from navigationItem leaves broken UI 【发布时间】:2017-10-02 20:04:04 【问题描述】:

当我通过设置“nil”从 navigationItem 中删除 searchController 时。空白空间留在原来的位置,而不是塌陷。

尝试调用,

searchController.dismiss()
navigationController.navigationItem.searchController.dismiss()
navigationItem.searchController.dismiss()
searchController.isActive = false

没有任何效果。


P.S - 使用模拟器

【问题讨论】:

【参考方案1】:

您应该在移除搜索控制器后布局子视图。诀窍是你必须布局哪个超级视图的子视图:因为navigationItem 是导航堆栈的一部分,所以你应该在当前navigationController 上调用layoutSubviews()

navigationItem.searchController = nil
navigationController?.view.setNeedsLayout()
navigationController?.view.layoutIfNeeded()

根据 Apple 文档,您不应直接致电 layoutSubviews()

【讨论】:

这工作正常,只需将其添加回来navigationItem.searchController = yourSearchControllerObject 我无法让它工作。它确实注意到我的表格视图/搜索内容向上移动到正确的位置,但导航栏的大小仍然太大。 拯救了我的一天!我花了几个小时在这个问题上纠结。这是唯一对我有用的东西!【参考方案2】:

使用这个:

let search = UISearchController(searchResultsController: nil)

如果你在下面设置,那么删除这一行

self.navigationItem.searchController = search

【讨论】:

空白区域仍然存在,如果搜索栏处于活动状态,它会与导航栏一起消失。 该答案以及随后将其设置为 nil 有效。谢谢。 :D 我遇到了一个问题,如果我使用上面的代码并使用 navController 进行 segued,无论我做了什么,nav 的标题都会出现在 childVC 中。为了解决这个问题,我首先使用了这条线。 navigationItem.searchController?.hidesNavigationBarDuringPresentation = false 我希望这能解决你可能从上面的操作中得到的 VC 的 segueing 和奇怪的问题。 这样做似乎可行,但我注意到搜索栏仍然存在于视图层次结构中。 @SergeyGamayunov 回答对我有用

以上是关于iOS11 SearchController - 从 navigationItem 中移除 SearchBar 会留下损坏的 UI的主要内容,如果未能解决你的问题,请参考以下文章

iOS 11 上 UITableView 中的 UISearchController 问题

UISearchBar在iOS 11中的错误位置

在 iOS 11 中限制 UISearchBar 的高度

如何在 iOS 11 上删除 UISearchController 下的行?

iOS13 中的 SearchController

如何让 navigationItem.searchController 的 searchBar 使用屏幕的全宽