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包括两件事情:
- 确保呈现的视图控制器的
definesPresentationContext
设置为YES
- 确保推送的视图控制器和推视图控制器都布置在导航栏的下方(将
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
是规范应用程序颜色主题的类。