【问题标题】:UISearchController changing status bar color on invocationUISearchController 在调用时更改状态栏颜色
【发布时间】:2015-10-28 21:57:15
【问题描述】:

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

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 底部显示在tableView 的下方。

【问题讨论】:

标签: ios uitableview uistatusbar uisearchcontroller uirefreshcontrol


【解决方案1】:

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

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

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

【讨论】:

  • 有趣的修复。很好奇,如果extendedLayoutIncludesOpaqueBars 设置为NO 但definePresentationContext 设置为YES,您是否遇到过搜索栏向下移动的问题?
  • 是的。和你描述的完全一样。
【解决方案2】:

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

- (UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}

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

【讨论】:

  • 这是正确的答案,把它放在UISearchController 子类中是行不通的。谢谢!
【解决方案3】:

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

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

【讨论】:

  • 这在 iOS 10 之前运行良好,你有没有为 10 找到更好的解决方案?
  • 我找到了解决方案:从 iOS 10 开始,UISearchController 向呈现视图控制器(通常是您的表格视图控制器)询问状态栏样式。你应该在那里实现-preferredStatusBarStyle
【解决方案4】:

如果您的 ViewController 在 TabBarController 中,那么 -

代替 self.definesPresentationContext = YES;

使用 self.tabBarController.definesPresentationContext = YES;

这在上述情况下对我有用。

【讨论】:

    【解决方案5】:

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

    下面是类的实现文件示例:

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

    【讨论】:

      【解决方案6】:

      或者我们可以在 Swift 上写一个扩展(版本 2,但你可以很容易地把它翻译成 3):

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

      其中Theme 是一个规范应用颜色主题的类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-07
        • 1970-01-01
        • 2016-10-25
        • 1970-01-01
        • 2020-01-23
        • 2016-09-08
        • 1970-01-01
        相关资源
        最近更新 更多