在 XCode 8.2 / Swift 3.0 中更改状态栏样式(没有“查看基于控制器的状态栏外观”)

Posted

技术标签:

【中文标题】在 XCode 8.2 / Swift 3.0 中更改状态栏样式(没有“查看基于控制器的状态栏外观”)【英文标题】:Change Status Bar style in XCode 8.2 / Swift 3.0 (No "View controller-based status bar appearance") 【发布时间】:2017-06-09 00:25:55 【问题描述】:

我正在尝试修改状态栏的外观(将文本设为白色/将样式设置为“浅色”)。我设法通过将其添加到我的 AppDelegate.swift 文件来设置背景颜色:

let statWindow = UIApplication.shared.value(forKey:"statusBarWindow") as! UIView
let statusBar = statWindow.subviews[0] as UIView
statusBar.backgroundColor = UIColor(red: 0/255.0, green: 0/255.0, blue: 0/255.0, alpha: 1.0)

但是,当我去更改状态栏文本的样式时,即使在“常规”>“部署信息”>“状态栏样式”下更改(将其更改为“轻”)也不起作用。

我也尝试通过 Info.plist 修改状态栏,但是没有“查看基于控制器的状态栏外观”字段(见第二张图)。此外,状态栏样式选项下没有“轻”样式选项(见下图):

状态栏样式选项:

没有视图控制器状态栏字段:

【问题讨论】:

【参考方案1】:

您错过的步骤是 Info.plist。

打开应用的info.plist文件,将UIViewControllerBasedStatusBarAppearance设置为NO(如下图)。

注意:如果此密钥尚不存在,则可以通过以下方式添加:

1) 将鼠标悬停在现有条目上以显示添加/删除图标:

2) 点击加号图标添加新的键/值对:

3) 将UIViewControllerBasedStatusBarAppearance 粘贴到关键字段并将其值设置为NO。请注意,取消选择时,密钥将更改为View controller-based status...,但它是同一件事:

【讨论】:

你错过了我帖子中的一些细节 - 我的 info.plist 中不存在该字段 :( 我添加了第二张图片来向你展示我的 info.plist 文件的样子 我相信@enghong 建议您将该键添加到 Info.plist。您可以将鼠标悬停在应该显示加号/减号图标对的现有条目上,单击加号图标,粘贴建议的键,然后将值设置为 NO(这是我的默认值)。然后,您应该在整个应用程序中都有白色状态栏文本,而无需手动设置每个 UIViewController 子类。至少这对我有用。 这是正确的答案,正是我想要的。设置 BOTH 键后,全局状态栏内容设置为亮,无需代码。【参考方案2】:

在应用程序的每个 UIViewController 中,您应该覆盖 preferredStatusBarStyle 属性:

override var preferredStatusBarStyle: UIStatusBarStyle  return .lightContent 

最后,调用:

<your controller>.setNeedsStatusBarAppearanceUpdate()

如果此 statusBar 样式贯穿于您的所有应用程序,您应该创建一个实现该样式的 BaseViewController 类,并使您的所有视图控制器都继承自 BaseViewController。

【讨论】:

除此答案外,另请参阅此处:***.com/questions/41026514/…【参考方案3】:

斯威夫特 3

如果在 Info.plist 中查看基于控制器的状态栏外观 = YES

然后将此扩展用于所有 NavigationController

    extension UINavigationController
    
        override open var preferredStatusBarStyle: UIStatusBarStyle 
        return .lightContent
         
     

如果没有 UINavigationController 并且只有 UIViewController 然后使用下面的代码:

    extension UIViewController
    
        override open var preferredStatusBarStyle: UIStatusBarStyle 
        return .lightContent
         
     

目标c

创建类别类

对于 UIViewController

在 UIViewController+StatusBarStyle.h

 @interface UIViewController (StatusBarStyle)
 @end

在 UIViewController+StatusBarStyle.m 中

 #import "UIViewController+StatusBarStyle.h"

 @implementation UIViewController (StatusBarStyle)

 -(UIStatusBarStyle)preferredStatusBarStyle 
  return UIStatusBarStyleLightContent;
 

 @end 

对于 UINavigationController

在 UINavigationController+StatusBarStyle.h

 @interface UINavigationController (StatusBarStyle)
 @end

在 UINavigationController+StatusBarStyle.m

 #import "UINavigationController+StatusBarStyle.h"

 @implementation UINavigationController (StatusBarStyle)

 -(UIStatusBarStyle)preferredStatusBarStyle 
  return UIStatusBarStyleLightContent;
 

 @end  

【讨论】:

【参考方案4】:

对于 Xcode 10,您可以简单地为 UIViewController 或 UITableViewController ecc 创建一个类。并将其放在您的 UIViewController 类之前,您可以在所有需要轻量内容状态栏的视图控制器中调用此类...

class UIViewControllerWithLightStatusBar: UIViewController 
override var preferredStatusBarStyle: UIStatusBarStyle 
return UIStatusBarStyle.lightContent


在 AppDelegate 中设置状态栏:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
    // Override point for customization after application launch.

    UINavigationBar.appearance().isTranslucent = false
    UINavigationBar.appearance().clipsToBounds = false
    UINavigationBar.appearance().barStyle = .blackOpaque

    return true

现在你用 UIViewControllerWithLightStatusBar 改变类 UIViewController

class YourViewController: UIViewControllerWithLightStatusBar 
...

就是这样……

【讨论】:

以上是关于在 XCode 8.2 / Swift 3.0 中更改状态栏样式(没有“查看基于控制器的状态栏外观”)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SWIFT3 XCODE 8.2 的 IOS 应用程序中显示 Snackbar 的操作中的特定视图

Xcode 8.2,Swift 编译器错误:错误:意外的输入文件

Xcode 8.2使用旧版Swift问题[重复]

如何在SWIFT3 XCODE 8.2中的IOS应用程序中的Snackbar的操作中显示特定视图

在 Xcode 8.0 Swift 3.0 上检测手势

在 Xcode 8 和 Swift 3.0 中删除覆盖后准备 segue 崩溃