iOS 11 UINavigationBar UISearchBar和UIBARBUTTONIM重叠
在iOS 11中,如果将UISearchBar设置为navigationItem的标题视图。然后将UIBarButtonItem添加/删除到navigationItem.leftBarButtonItems。uibarbuttonite将与UISearchBar重叠 复制步骤:iOS 11 UINavigationBar UISearchBar和UIBARBUTTONIM重叠,ios,uinavigationbar,uisearchbar,ios11,uibarbuttonitem,Ios,Uinavigationbar,Uisearchbar,Ios11,Uibarbuttonitem,在iOS 11中,如果将UISearchBar设置为navigationItem的标题视图。然后将UIBarButtonItem添加/删除到navigationItem.leftBarButtonItems。uibarbuttonite将与UISearchBar重叠 复制步骤: 新的单视图Xcode项目 将ViewController嵌入到情节提要中的UINavigationController中 像这样修改ViewController.swift class ViewController:
class ViewController: UIViewController {
let button = UIBarButtonItem(barButtonSystemItem: .add, target: nil, action: nil)
override func viewDidLoad() {
super.viewDidLoad()
let searchBar = UISearchBar()
searchBar.searchBarStyle = .minimal
navigationItem.titleView = searchBar
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.horizontalSizeClass == .regular {
navigationItem.leftBarButtonItem = button
} else {
navigationItem.leftBarButtonItem = nil
}
}
}
我的问题是:UINavigationBar有没有办法正确布局项目,或者我在这里做错了什么?谢谢 尝试DispatchQueue.main.async
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
DispatchQueue.main.async {
if self.traitCollection.horizontalSizeClass == .regular {
self.navigationItem.leftBarButtonItem = self.button
} else {
self.navigationItem.leftBarButtonItem = nil
}
}
}
重置导航项。
视图中的标题视图将出现
设置titleView=nil
并返回到搜索栏以强制导航栏重新布局
比如:
覆盖函数视图将出现(u动画:Bool){
超级。视图将显示(动画)
navigationItem.titleView=nil
navigationItem.titleView=self.searchBar
}
更多细节 我喜欢使用
traitCollectionDidChange
的公认解决方案
然而,这种解决方案在我的iPhone 11 Pro Max(目前的iOS 14.4)上不起作用(而且只在!)
这是一个非常奇怪的问题,但是
视图中的重置将出现
是我在所有设备上找到的唯一可靠解决方案。不幸的是,每次应用程序从后台移到前台时,重叠都会再次发生。在使用多任务时也是如此。我正试图通过在需要时重新配置异步块中的条形按钮来解决这个问题。我必须使用DispatchQueue.main.async
中的viewwilltransitiononsize
以及应用程序何时进入前台来重新配置按钮。苹果的QA怎么了?我认为这不是问题
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.setNavigationBarHidden(true, animated: false)
navigationController?.setNavigationBarHidden(false, animated: true)
}