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
希望对你的情况有所帮助
事实证明,如果在推送新的UIViewController
时UISearchController
未被聚焦,则不会出现此问题。
只需确保在推送新 ViewController 之前你会做
self.navigationItem.searchController.dismiss(animated: false, completion: nil)
.
如果返回后必须将“焦点”放在搜索控制器上,请再次从 viewWillAppear
中的代码创建焦点。
我有一个 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
希望对你的情况有所帮助
事实证明,如果在推送新的UIViewController
时UISearchController
未被聚焦,则不会出现此问题。
只需确保在推送新 ViewController 之前你会做
self.navigationItem.searchController.dismiss(animated: false, completion: nil)
.
如果返回后必须将“焦点”放在搜索控制器上,请再次从 viewWillAppear
中的代码创建焦点。