我发现了四种不同的方法来更改Xcode中的iOS状态栏。为什么会有这么多,有什么区别?
我一直在尝试在我的Swift应用程序中更改状态栏的颜色,我在XCode中确定了四种方法。然而,我只能成功地使用方法3: 1。模拟指标(仅用于故事板显示) 2。更改常规->部署信息->状态栏样式 确保以下信息列表设置设置为“否”: 在此处的下拉框中选择“灯光”或“默认值”:我发现了四种不同的方法来更改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
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不同
但是考虑一个有不同颜色视图控制器的应用程序,其中一些用白色状态栏看起来更好,而其他的则用黑色看起来更好。对于这种方法,我们需要您的选项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()
}