UISearchController在调用时更改状态栏颜色

我有我的应用程序中的以下代码,特别是在viewDidLoad:设置我的UISearchController

 self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; self.searchController.searchResultsUpdater = self; self.searchController.hidesNavigationBarDuringPresentation = NO; self.searchController.dimsBackgroundDuringPresentation = NO; self.definesPresentationContext = NO; self.searchController.searchBar.scopeButtonTitles = @[]; self.searchController.searchBar.searchBarStyle = UISearchBarStyleProminent; [_tableView setTableHeaderView:_searchController.searchBar]; 

每当调用search栏(添加到tableView ), UIStatusBar颜色将从UIStatusBarStyleLightContent更改为黑色(白色到黑色)。 现在,我想清楚,如果我设置,

 self.definesPresentationContext = NO; 

如下:

 self.definesPresentationContext = YES; 

问题解决了, UIStatusBar颜色被保留了。 然而,另一个问题出现了。 当self.definesPresentationContext被设置为YES ,在调用时,search栏出于某种原因向下移动,恰巧(或正确地)在UIRefreshControl的底部显示在tableView的下方。

如果您希望视图控制器定义View-controller based status bar appearance ,则将View-controller based status bar appearance为“ No不是解决scheme。

我的解决scheme包括两件事情:

  1. 确保呈现的视图控制器的definesPresentationContext设置为YES
  2. 确保推送的视图控制器和推视图控制器都布置在导航栏的下方(将extendedLayoutIncludesOpaqueBars设置为YES

我需要完全控制我的状态栏颜色。 我使用这里find的扩展来确保可见视图控制器正在设置首选的状态栏颜色。

对我来说,因此有必要重写UISearchController并覆盖preferredStatusBarStyle并返回我想要的样式。

从iOS 10(也许更早?)开始,如果您在Info.plist中将“基于视图控制器的状态栏外观”设置为YES,只需在包含UISearchController的UIViewController中设置preferredStatusBarStyle即可。

 - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } 

(你不需要inheritance或创buildUISearchController的类别/扩展来覆盖preferredStatusBarStyle …它使用你在UIViewController中设置的preferredStatusBarStyle)

如果你的ViewController在TabBarController中,那么 –

而不是 self.definesPresentationContext = YES;

使用 self.tabBarController.definesPresentationContext = YES;

这在上面的情况下适用于我。

search控制器出现(处于活动状态)时显示的状态栏属于search控制器。 要设置首选状态栏样式,您必须向UISearchController添加一个类别,然后重写preferredStatusBarStyle方法。

以下是该类别的实施文件的一个例子:

 @implementation UISearchController (Customization) -(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } @end 

或者我们可以在Swift上编写一个扩展(版本2,但可以轻松地将其翻译为3):

 extension UISearchController { override public func preferredStatusBarStyle() -> UIStatusBarStyle{ if Theme.lightTheme() { return UIStatusBarStyle.Default } else { return UIStatusBarStyle.LightContent } } } 

Theme是规范应用程序颜色主题的类。