iOS 11 UINavigationBar UISearchBar和UIBARBUTTONIM重叠

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:

在iOS 11中,如果将UISearchBar设置为navigationItem的标题视图。然后将UIBarButtonItem添加/删除到navigationItem.leftBarButtonItems。uibarbuttonite将与UISearchBar重叠

复制步骤:

  • 新的单视图Xcode项目
  • 将ViewController嵌入到情节提要中的UINavigationController中
  • 像这样修改ViewController.swift

    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
            }
        }
    }
    
  • 环境:Xcode 9.2,iOS 11.2.2


    我的问题是: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)
    }