我发现了四种不同的方法来更改Xcode中的iOS状态栏。为什么会有这么多,有什么区别?

我发现了四种不同的方法来更改Xcode中的iOS状态栏。为什么会有这么多,有什么区别?,ios,xcode,swift,uiviewcontroller,Ios,Xcode,Swift,Uiviewcontroller,我一直在尝试在我的Swift应用程序中更改状态栏的颜色,我在XCode中确定了四种方法。然而,我只能成功地使用方法3: 1。模拟指标(仅用于故事板显示) 2。更改常规->部署信息->状态栏样式 确保以下信息列表设置设置为“否”: 在此处的下拉框中选择“灯光”或“默认值”: General->Deployment Info->Status Bar Style 3。手动设置它 确保将以下Info.plist设置设置为“否”: 插入以下代码(通常在didFinishLaunchingWi

我一直在尝试在我的Swift应用程序中更改状态栏的颜色,我在XCode中确定了四种方法。然而,我只能成功地使用方法3:

1。模拟指标(仅用于故事板显示)

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

确保以下信息列表设置设置为“否”:

在此处的下拉框中选择“灯光”或“默认值”:

General->Deployment Info->Status Bar Style
3。手动设置它

确保将以下Info.plist设置设置为“否”:

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

4。覆盖“preferredStatusBarStyle()”

确保以下Info.plist属性存在并设置为“是”:

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

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}
我目前的理解

模拟度量只是为了显示,在运行时不提供实际更改。我相信手动设置和在“常规”选项卡中更改设置可能在引擎盖下做同样的事情,但我不确定。我想还有一种方法可以直接为各个视图控制器设置此属性

问题

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

选择1 这没有任何作用,因为它只是一个模拟指标。您可以在interface builder中进行设置,但模拟度量只是模拟的,不会在运行时应用

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

选择3 与选项2类似,此选项阻止单个视图控制器设置状态栏外观(由于Info.plist设置),但与选项2不同,我们在运行时动态设置颜色。我们可以在启动时在应用程序代理中执行此操作。。。或者我们可以在其他时间改变它。也许我们有一个像谷歌地图应用程序那样的夜间模式,或者我们让用户在某处配置自己的主题颜色

选择4 如果要嵌入UINavigationController,则需要将UINavigationController子类化,并在此处重写“preferredStatusBarStyle()”

您可能缺少一个步骤。在
viewDidLoad
中,尝试指定您想要设置状态栏的机会

override func viewDidLoad() {
    super.viewDidLoad()

    setNeedsStatusBarAppearanceUpdate()
}

至于为什么对看似相同的事情有不同的处理方法,我们必须首先意识到这些其实不是同一件事

再一次,让我们把它分解

  • 选项1不是运行时更改,因此我们对它并不感兴趣
  • 选项2和3几乎是一样的
  • 选项4与选项2和3不同
为什么我们有你的选择2/3和选择4

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

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

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


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

模拟指标就是:模拟。更改模拟度量在运行时不会更改任何内容。是的,这也是我的理解。我主要是想解释为什么其他两种方法不起作用。模拟指标只会改变XCode情节提要预览。实际上,方法2和3工作正常,但我最初发布的内容是错误的。要使这些方法工作(至少对我来说),Info.plist属性必须存在,并且必须设置为“否”。否则,这些方法不会有任何效果。太好了,感谢您对选项4的解释和确认每个选项的功能。我还可以看到,如果您喜欢将UIViewController子类化,那么选项4非常有用,因为您可以创建一批继承相同样式的视图。我要补充的是,选项2本身将改变状态栏的全局样式,但它将被方法3覆盖。选项2只是选项3的前半部分。选项3完全包含了您在选项2中所做的一切。也许我不明白,但当我按照原始帖子中的描述使用选项2时(确保Info.plist条目存在并设置为否),全局效果与选项3相同。但是,选项3将覆盖选项2的设置。选项2的整套步骤似乎与选项3的前半部分相同。在选项2中,你在做什么,而在选项3中你没有做什么?我为“常规->部署信息->状态栏样式”选择“灯光”或“默认”。
UIApplication.sharedApplication().statusBarStyle = .LightContent
View controller-based status bar appearance : YES
override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}
override func viewDidLoad() {
    super.viewDidLoad()

    setNeedsStatusBarAppearanceUpdate()
}