移除 UISearchController 后,NavigationItem 不会恢复到原来的大小
Posted
技术标签:
【中文标题】移除 UISearchController 后,NavigationItem 不会恢复到原来的大小【英文标题】:NavigationItem does not return to its original size after removing the UISearchController 【发布时间】:2020-03-01 22:18:32 【问题描述】:来自 Wenderlich 的 Candy Search 克隆。我添加了一个图标来显示/隐藏搜索栏。
但是,从 navigationItem 中移除搜索控制器后,导航栏不会恢复到原来的大小。
有谁知道如何做到这一点?我尝试了几件事,但都没有奏效。
self.searchController.isActive = false
没有任何区别。
还有一件事,在这令人沮丧的时候,如果您现在单击一行以实例化一个细节控制器并返回,导航栏将恢复到正常高度!
谢谢!
看截图:
完整项目在这里:https://github.com/HerrDoktorBD/CVSearch
相关代码:
lazy var searchController: UISearchController =
let searchController = UISearchController(searchResultsController: nil)
searchController.searchBar.delegate = self
searchController.searchResultsUpdater = self
searchController.obscuresBackgroundDuringPresentation = false
searchController.searchBar.placeholder = "Search Candy"
// scope bar
searchController.searchBar.scopeButtonTitles = [
"All",
"Chocolate",
"Hard",
"Other"
]
return searchController
()
func showSearchBar(show: Bool)
let sb: UISearchBar = searchController.searchBar
if show
//print("show searchbar")
UIView.animate(withDuration: 0.3,
delay: 0.0,
options: .curveEaseOut,
animations:
if #available(ios 13, *)
self.navigationItem.searchController = self.searchController
, completion: (status) in
sb.becomeFirstResponder()
)
else
//print("hide searchbar")
UIView.animate(withDuration: 0.3,
delay: 0.0,
options: .curveEaseOut,
animations:
sb.resignFirstResponder()
, completion: (status) in
if #available(iOS 13, *)
self.navigationItem.searchController = nil
)
【问题讨论】:
您是否尝试过更新布局。 [self.view.layoutIfNeeded()] 感谢您的建议,但没有帮助。我还尝试了self.view.setNeedsLayout()
,它使tableview 向上滑动,但navigationItem 高度仍然不会重置。我们越来越近了……
我在另一个堆栈帖子上找到了这个。 navigationController?.view.setNeedsLayout() navigationController?.view.layoutIfNeeded() m8 工作检查这个! ***.com/questions/46318022/…
那行得通。我不得不用self.perform(#selector(self.forceNavHeightReset), with: nil, afterDelay: 0.1)
打电话给@objc func forceNavHeightReset() self.navigationController?.view.setNeedsLayout() self.navigationController?.view.layoutIfNeeded()
。更新了 github 仓库。非常感谢。
我可以添加这个作为答案你会投票吗?
【参考方案1】:
改为更新导航视图的高度
navigationController?.view.setNeedsLayout()
navigationController?.view.layoutIfNeeded()
编码愉快!
【讨论】:
以上是关于移除 UISearchController 后,NavigationItem 不会恢复到原来的大小的主要内容,如果未能解决你的问题,请参考以下文章
iOS UISearchController:等到 UISearchController 在取消搜索后被解除
UISearchController 关闭后 UITableView 标头大小发生变化
UISearchController 打开后,iOS 13 无法滚动到底部
添加 UISearchController 后 UITableView 可以滚动到顶部太远
过滤后的 didSelectRowAtIndexPath 索引路径 UISearchController - Swift