UISearchController 后 UIViewController 大小错误

UIViewController wrong size after UISearchController

我有一个 UIViewController,我在 navigationbar 中显示 UISearchController。在 ios11 . + 中,这将增加 navigationbar 高度。这对我来说没关系。因此,用户单击我的按钮以显示 searchbar,然后我显示它。如果用户单击取消按钮,我将删除 searchbar。 当用户单击按钮以显示 searchbar 并且在此之后,用户想要去另一个 UIViewController 时,就会出现问题。我加载了另一个 UIViewController 并且在 navigationbar 和内容之间出现了一个黑条。 我注销了视图的高度:

这些是理想尺寸:

viewDidLoad - NavBar SIZE: 44.000000

viewDidLoad - view SIZE: 667.000000

viewWillAppear - NavBar SIZE: 44.000000

viewWillAppear - view SIZE: 603.000000

这些尺寸有误:

viewDidLoad - NavBar SIZE: 44.000000

viewDidLoad - view SIZE: 667.000000

viewWillAppear - NavBar SIZE: 44.000000

viewWillAppear - view SIZE: 551.000000

可以看到viewWillAppear方法中view的高度比预期的要小。为什么? 我试图强制更新布局:

[self.view layoutIfNeeded];
[self.view setNeedsLayout];

但它不起作用。

ios11 + 导航栏 + 搜索栏自启动以来总是出现问题

当我从具有搜索栏的视图控制器推送视图控制器时,视图大小不同时,我遇到了类似的问题。并在导航栏

旁边显示 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

希望对你的情况有所帮助

事实证明,如果在推送新的UIViewControllerUISearchController未被聚焦,则不会出现此问题。

只需确保在推送新 ViewController 之前你会做 self.navigationItem.searchController.dismiss(animated: false, completion: nil).

如果返回后必须将“焦点”放在搜索控制器上,请再次从 viewWillAppear 中的代码创建焦点。