如何在iOS 6上更改模态视图的状态栏

12
我有以下的情况:
主视图(自定义UIViewController,没有导航控制器或导航栏),其中包含一个按钮,该按钮以模态方式切换到第二个表视图控制器,该控制器嵌入在导航控制器中:
MainView -> Navigation Controller -> TableView
在MainView上,状态栏为黑色(即使将状态栏设置为默认值,在iOS 6上也不会更改)。 在TableViewController上,状态栏应为默认样式(在iOS 5中为灰色,在iOS 6中由于导航栏而带有蓝色色调)。
在iOS 5中,可以通过在TableViewController中添加以下代码轻松实现:
if ([[UIApplication sharedApplication] respondsToSelector:@selector(setStatusBarStyle:)]) {
   [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
}

在iOS 6上运行此代码没有任何反应。我该如何解决?我已经尝试了项目概要和plist中所有可能的状态栏设置(例如这里所描述的:https://dev59.com/52cs5IYBdhLWcg3w8oTK#12468689)。

另外,在Storyboard中一切看起来都很好。但在模拟器或设备上运行时,它看起来不同:

StoryboardSimulator
3个回答

4

尝试这个“hack”:

你需要在第一个视图控制器中添加一个导航栏。然后你有两种可能性。

1)将导航栏的 alpha 值设置为 0

2)将栏的 y 位置设置为 -43px(看这里:http://moduscreate.com/tinting-your-status-bar-in-ios6-and-phonegap/

编辑:

要获得正确的颜色,您需要设置不可见的 UINavigationBar 的 tintColor。所以默认设置为黑色。在你的按钮动作中,你需要将 tintColor 设置为你的 navigationController.navigationBar.tintColor。在关闭按钮的操作中,你需要将其设置回 [UIColor blackColor]。


我认为苹果公司没有干净地实现状态栏着色功能。你的解决方案只是一个变通方法。正确的解决方案应该是应用程序在每个视图控制器上检查状态栏的着色 - 而不仅仅是在第一个视图控制器上。 - FrankZp

2

该功能需要第一个视图控制器有一个导航控制器/栏。在iOS6中,状态栏不会在整个应用程序中改变颜色,但会适应您起始视图的导航栏颜色。如果您的起始视图没有包含导航栏,则状态栏不会改变颜色!(见http://i.stack.imgur.com/n9ubK.png


是的,这个新功能会选择顶部导航栏的颜色来着色状态栏。但是这里的要求是,第一个视图控制器没有导航栏。在iOS 5中,可以使用上面的代码实现。但是在iOS 6中,状态栏是不可更改的! - FrankZp
1
在TableViewController上,状态栏应该具有默认样式(在iOS 5中为灰色,在iOS 6中由于导航栏而带有蓝色色调)。这个假设是错误的。 - der_michael
上面显示的代码将TableViewController的状态栏设置为默认样式。这在iOS5中有效,但在iOS6中无效(状态栏仍为黑色-请参见模拟器截图)。 - FrankZp

0

您不必为导航栏设置样式以适应您的tableviewcontroller。

尝试这种方法。 1. 将导航控制器添加到主视图中。 2. 将其属性隐藏设置为是。 3. 当您显示tableviewcontroller时,将导航栏属性隐藏设置为否

导航控制器 -> 隐藏栏= 是 -> 主视图 -> 隐藏栏=否 -> TableView


问题在于TableViewController是以模态方式显示的。因此,MainViewController和TableViewController不能嵌入同一个导航控制器中(请参见Storyboard截图)。当使用两个导航控制器(一个用于MainView,另一个用于TableView)时,上述描述的问题仍然存在... - FrankZp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接