我有一个带有 TableView 但没有 NavigationBar/NavigationController 的简单应用程序。该应用程序还有一个 UISearchController 和一个始终可见的 SearchBar。我尝试使用 prefersStatusBarHidden 隐藏状态栏,效果很好。直到搜索栏被激活。然后状态栏将再次出现。
如何防止这种情况发生并保持状态栏隐藏?
var cityRepository:CityRepository?
var searchController:UISearchController?
override func viewDidLoad()
{
self.cityRepository = CityRepository()
self.searchController = UISearchController(searchResultsController: nil)
self.searchController!.searchResultsUpdater = self
self.searchController!.dimsBackgroundDuringPresentation = false
self.definesPresentationContext = true
self.tableView.tableHeaderView = searchController?.searchBar
//* Already tried this ....
self.edgesForExtendedLayout = UIRectEdge.None
self.extendedLayoutIncludesOpaqueBars = true
self.automaticallyAdjustsScrollViewInsets = false
super.viewDidLoad()
}
override func prefersStatusBarHidden() -> Bool
{
return true
}
最佳答案
Swift 3
要有选择地显示状态栏,您必须实现以下操作:
转到 Info.plist,添加“查看基于 Controller 的状态栏外观”-> 是。这将使您能够根据特定 View 的 prefersHiddendStatusBar 变量的状态设置外观。
Interface Builder 中的设置仅用于模拟指标;也就是说,使用 Interface Builder 时 StoryBoard 对象中显示的内容。
接下来,您需要创建一种方法来存储您的条件首选项:“我想现在显示状态栏吗?”在 View Controller 中,创建一个 bool 变量来保存此首选项:
var displayStatusBar: Bool = false
然后,当您使用 SearchController 时,您必须绑定(bind)到与搜索栏交互时触发的特定委托(delegate)方法。我建议使用:
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar)
和
func searchBarCancelButtonClicked(_ searchBar: UISearchBar)
在每个委托(delegate)方法中,您可以将 displayStatusBar 变量设置为 true 或 false,然后在每个方法中使用 setNeedsStatusBarAppearanceUpdate()。这将强制在状态栏中重新加载。如果您认为它看起来不稳定,请将该代码放入 UIView.animate(withDuration:_) 完成 block 中,以获得良好且平滑的视觉变化。
最后,您需要覆盖 View 的首选状态变量并将其设置为首选项变量。
override var prefersStatusBarHidden: Bool {
return hideStatusBar
}
关于ios - 激活搜索栏时会出现隐藏状态栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35563770/