我有UIViewController
,我在UISearchController
中显示navigationbar
。在ios11 . +
中,这会增加navigationbar
高度。这对我没问题。因此,用户点击我的按钮以显示searchbar
,然后我会显示它。如果用户单击取消按钮,则删除searchbar
。
当用户单击按钮以显示searchbar
时,问题就出现了,此后,用户想要转到另一个UIViewController
。我加载另一个UIViewController
,我在navigationbar
和内容之间有一个黑条。
我注销了视图的高度:
这些是理想的尺寸:
viewDidLoad - NavBar SIZE:44.000000
viewDidLoad - 查看大小:667.000000
viewWillAppear - NavBar SIZE:44.000000
viewWillAppear - 查看SIZE:603.000000
这些是错误的尺寸:
viewDidLoad - NavBar SIZE:44.000000
viewDidLoad - 查看大小:667.000000
viewWillAppear - NavBar SIZE:44.000000
viewWillAppear - 查看SIZE:551.000000
您可以看到viewWillAppear
方法中视图的高度小于预期。为什么?
我试图强制更新布局:
[self.view layoutIfNeeded];
[self.view setNeedsLayout];
但它不起作用。
答案 0 :(得分:0)
ios11 +导航栏+搜索栏自启动以来总是会产生问题
当我从具有搜索栏的View控制器推出View控制器时,View Size遇到了类似的问题。并在导航栏旁边显示 BLACK BAR
有许多解决方案可用,例如搜索栏的固定高度,但它的行为意外
为此我找到了创建UIView
子类的解决方案class SearchBarContainerView: UIView {
let searchBar: UISearchBar
init(customSearchBar: UISearchBar) {
searchBar = customSearchBar
super.init(frame: CGRect.zero)
addSubview(searchBar)
}
override convenience init(frame: CGRect) {
self.init(customSearchBar: UISearchBar())
self.frame = frame
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
super.layoutSubviews()
searchBar.frame = bounds
}
}
然后将其用作标题视图
// Search bar
searchController = UISearchController(searchResultsController: nil)
self.searchController.searchResultsUpdater = self
self.searchController.delegate = self
self.searchController.searchBar.delegate = self
self.searchController.hidesNavigationBarDuringPresentation = false
self.searchController.dimsBackgroundDuringPresentation = true
self.searchController.searchBar.backgroundColor = .clear
self.searchController.searchBar.placeholder = nil
self.definesPresentationContext = true
let searchBarContainer = SearchBarContainerView(customSearchBar: self.searchController.searchBar)
searchBarContainer.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: 44)
navigationItem.titleView = searchBarContainer
希望它对你有帮助
答案 1 :(得分:0)
事实证明,当您按下新的UISearchController
时,如果UIViewController
没有聚焦,就不会出现此问题。
只需确保在推送新的ViewController之前,您将
self.navigationItem.searchController.dismiss(animated: false, completion: nil)
。
如果必须在返回后将焦点放在搜索控制器上,请再次根据viewWillAppear
中的代码创建焦点。