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

时间:2015-08-05 22:51:51

标签: ios uitableview uistatusbar uisearchcontroller uirefreshcontrol

我的应用中有以下代码,特别是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];

每当调用搜索栏(添加到tableView)时,UIStatusBar颜色从UIStatusBarStyleLightContent变为暗(白色变为黑色)。现在,我想出是否设置,

self.definesPresentationContext = NO;

以下内容:

self.definesPresentationContext = YES;

问题已解决,UIStatusBar颜色被保留。但是,出现了另一个问题。将self.definesPresentationContext设置为YES时 ,在调用时,搜索栏由于某种原因向下移动,恰好(或正确地)向下UIRefreshControl的{​​{1}}底部所在的位置。

6 个答案:

答案 0 :(得分:4)

从iOS 10开始(可能更早?),如果你有"查看基于控制器的状态栏外观"在Info.plist中设置为YES,只需在UIViewController中设置包含UISearchController的preferredStatusBarStyle。

- (UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}

(您不需要子类化或创建UISearchController的类别/扩展来覆盖preferredStatusBarStyle ...它使用您在UIViewController中设置的preferredStatusBarStyle)

答案 1 :(得分:3)

如果您希望视图控制器定义状态栏的外观,则将View-controller based status bar appearance设置为No不是解决方案。

我的解决方案包括两件事:

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

如果ViewController在TabBarController中,那么 -

而不是  self.definesPresentationContext = YES;

使用 self.tabBarController.definesPresentationContext = YES;

这在上面的场景中对我有用。

答案 4 :(得分:0)

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

以下是该类别的实施文件的示例:

@implementation UISearchController (Customization)

-(UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}

@end

答案 5 :(得分:-2)

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

extension UISearchController {

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

Theme是一个规范app颜色主题的类。