我的应用程序背景是黑色的,但在iOS 7中,状态栏变成了透明的。所以我什么也看不见,只有角落里的绿色电池指示灯。如何将状态栏文本颜色改为白色,就像在主屏幕上一样?


当前回答

简单地调用

[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];

-(BOOL)application:(UIApplication *)application 
           didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
}

我的AppDelegate的方法在iOS7中非常适合我。

其他回答

如果你想将它设置为任何颜色,请使用下面的代码。

id statusBarWindow = [[UIApplication sharedApplication] valueForKey:@"statusBarWindow"];
id statusBar = [statusBarWindow valueForKey:@"statusBar"];

SEL setForegroundColor_sel = NSSelectorFromString(@"setForegroundColor:");
if([statusBar respondsToSelector:setForegroundColor_sel]) {
    // iOS 7+
    [statusBar performSelector:setForegroundColor_sel withObject:YourColorHere];
                                                                 ^^^^^^^^^^^^^
}

我知道我正在访问私有API,但我已经在许多项目中使用了这个,苹果已经批准了它。

在提交应用程序时,将此代码发送到Apple的评论部分,并告知您正在使用此代码更改状态栏的颜色。

是的,不要忘记下面的内容。

Xcode似乎一直在改变这个,所以这是最新的。

截至2021年,Swift 5, Xcode 12

设置状态栏为白色。

打开你的Info.plist。 添加键UIViewControllerBasedStatusBarAppearance并将值设置为No (false)。人类可读的版本是“基于视图控制器的状态栏外观”。 添加键UIStatusBarStyle和设置值UIStatusBarStyleLightContent(即“轻内容”)。

实现这一功能的关键是只有全屏视图控制器才能指定状态栏的样式。

如果你正在使用一个导航控制器,并且想要在每个视图控制器的基础上控制状态栏,你会想要子类化UINavigationController并实现preferredStatusBarStyle,这样它就会返回topViewController的首选项。

确保你将故事板场景中的类引用从muinavigationcontroller更改为你的子类(例如下面例子中的MyNavigationController)。

(以下方法对我有用。如果你的应用程序是基于TabBar,你会想做类似的事情通过子类化UITabBarController,但我还没有尝试出来)。

@interface MyNavigationController : UINavigationController

@end

@implementation MyNavigationController

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return self.topViewController.preferredStatusBarStyle;
}

@end

iOS 7允许单独的视图控制器来决定状态栏的外观,如苹果开发者文档所述:

ios7允许视图控制器在应用程序运行时调整状态栏的样式。动态改变状态栏样式的一个好方法是实现preferredStatusBarStyle并在一个动画块内更新状态栏外观并调用setNeedsStatusBarAppearanceUpdate。

全局设置状态栏外观是一个两步过程。

首先,你需要告诉iOS你不想按视图来设置状态栏外观。

然后你需要负责并实际设置新的全局状态栏样式。

要禁用逐视图状态栏控件,您需要在Info.plist中设置基于视图控制器的状态栏外观属性。

打开项目导航器,选择iOS应用程序的项目,然后选择信息选项卡。

将鼠标悬停在一行上,然后单击出现的加号,将新属性添加到.plist。

在Key字段中输入基于视图控制器的状态栏外观,然后确保Type字段设置为Boolean。最后,在Value字段中输入NO。

要为状态栏设置全局样式,在Info选项卡下添加另一个属性,键为状态栏样式,类型为字符串,值为不透明黑色样式。

下面是一篇博客文章,其中有更多的细节和一些示例代码:

http://codebleep.com/setting-the-status-bar-text-color-in-ios-7/

在ios7上,如果你想使用UIViewControllerBasedStatusBarAppearance == YES,并且你的根视图控制器是UINavigationController,你应该这样做 子类化它并重载childViewControllerForStatusBarStyle,例如:

- (UIViewController*) childViewControllerForStatusBarStyle
{
    return self.viewControllers.lastObject;
}

在这之后,preferredStatusBarStyle将在被推送的视图控制器上被调用。