UIVearchController之后UIViewController的大小错误

时间:2018-04-13 06:28:12

标签: ios ios-autolayout

我有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];

但它不起作用。

2 个答案:

答案 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中的代码创建焦点。