我找到了四种不同的方式来改变Xcode中的iOS状态栏.为什么会有这么多,有什么区别?

Vei*_*ita 9 xcode uiviewcontroller ios swift

我一直试图改变我的Swift应用程序中状态栏的颜色,我已经确定了在XCode中执行此操作的四种方法.然而,我只能成功使用方法3:

1.模拟指标(仅限故事板显示)

2.更改常规 - >部署信息 - >状态栏样式

确保以下Info.list设置设置为"NO":

View controller-based status bar appearance : NO
Run Code Online (Sandbox Code Playgroud)

在此处的下拉框中选择"Light"或"Default":

General->Deployment Info->Status Bar Style
Run Code Online (Sandbox Code Playgroud)

3.手动设置

确保以下Info.plist设置设置为"NO":

View controller-based status bar appearance : NO
Run Code Online (Sandbox Code Playgroud)

插入以下代码(通常在didFinishLaunchingWithOptions中):

UIApplication.sharedApplication().statusBarStyle = .LightContent
Run Code Online (Sandbox Code Playgroud)

4.覆盖"preferredStatusBarStyle()"

确保存在以下Info.plist属性并将其设置为"YES":

View controller-based status bar appearance : YES
Run Code Online (Sandbox Code Playgroud)

然后将以下代码添加到为Storyboard中的ViewController设置的UIViewController(或派生类):

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}
Run Code Online (Sandbox Code Playgroud)

我目前的理解

模拟指标仅用于显示,并且在运行时不提供实际更改.我相信手动设置和更改常规选项卡中的设置可能会做同样的事情,但我不确定.我想有一种方法可以直接为各个视图控制器设置此属性.

出于某种原因,实际上对我有用的唯一方法是方法3,手动设置.其他方法都没有提供任何改变.就个人而言,我更喜欢在派生类中重写,所以我有一个共享UIViewController样式的中心位置.

nhg*_*rif 11

选项1

这没什么,因为它只是一个模拟的指标.您可以在界面构建器中进行设置,但模拟的度量标准只是模拟的,不会在运行时应用.

选项2

此选项可防止各个视图控制器设置状态栏外观(由于Info.plist设置),并且它依赖于部署设置中的默认颜色集,但该值可以在运行时更改(请参阅选项3).

选项3

与选项2一样,此选项可防止各个视图控制器设置状态栏外观(由于Info.plist设置),但与选项2不同,我们在运行时动态设置颜色.我们可以在发布时在app委托中执行此操作...或者我们可以在其他时间更改它.也许我们有像谷歌地图应用程序的夜间模式,或者我们可能让用户在某处配置自己的主题颜色.

选项4

如果您正在嵌入UINavigationController,那么您将需要子类UINavigationController并在此处覆盖"preferredStatusBarStyle()".

你可能会错过这里概述的一个步骤.在viewDidLoad,尝试指定您希望有机会设置状态栏.

override func viewDidLoad() {
    super.viewDidLoad()

    setNeedsStatusBarAppearanceUpdate()
}
Run Code Online (Sandbox Code Playgroud)

至于为什么对于看似相同的事情有不同的方法,我们必须首先意识到这些实际上并不是同一个东西.

再次,让我们分解它.

  • 选项1不是运行时更改,因此它对我们来说真的没有意义.
  • 选项2和3几乎是一回事.
  • 选项4与选项2和3不同.

为什么我们有2/3选项和4选项?

因为在某些应用程序中,您可能希望应用程序中的每个视图控制器具有相同的状态栏颜色,但根据某些设置,状态栏颜色可能会有所不同.

例如,考虑使用Google地图应用.在晚上,应用程序变黑,状态栏需要显示白色,但在白天,应用程序为白色,状态栏需要为黑色.每个视图控制器都是一样的,因此设置颜色的代码只需要在一个地方实现(不要求每个视图控件都从同一个基本父级继承).为此,我们可能希望您选择2/3.

但是考虑一个具有不同颜色的视图控制器的应用程序,其中一些使用白色状态栏看起来更好,而其他看起来更好用黑色.对于这种方法,我们需要您的选项4,并让每个视图控制器分别指定状态栏应该是什么颜色.

简而言之,您的选项2/3是一个全局状态栏设置,无论您在应用程序中的哪个位置都适用,而选项4是本地的每VC设置.