状态栏在iPhone 6 iOS 8模拟器上只显示黑色文本

45

我想将我的iOS 7应用程序转换为Xcode 6 GM中的iOS 8版本,在iOS 8的iPhone 5s或以下模拟器上运行一切正常,但在iPhone 6和6 Plus模拟器上,状态栏的文字是黑色而不是白色,这在任何其他地方都是白色的。我通过Xcode将Info.plist UIStatusBarStyle设置为“Transparent Black Style(alpha of 0.5)”,并且似乎在其他任何地方都有预期的效果。有任何想法吗?

(我还没有触碰任何故事板,可能与此有关吗?我希望能够推迟一段时间:)


1
所以我有同样的问题,在我的两个应用程序上略有不同:在一个应用程序中,它在启动画面期间开始为黑色,一旦UI加载完成就变为白色,正如我所希望的那样。在iOS 7上,它总是以白色启动。在另一个应用程序中,在iOS 8上它始终保持黑色,或者我认为是这样。事实证明,在运行iOS 8的iPhone 5S上,它是白色的,就像应该的那样。在缩放UI的iPhone 6上,它很好,但标准UI则不行。然而,iPhone 6 Plus始终是黑色的,无论UI是缩放还是标准...可能是iOS 8中的一个错误吧... - CMash
14个回答

50
所以这是我如何修复它的方式
在PLIST中, 查看控制器基础状态栏为NO 状态栏样式UIStatusBarStyleLightContent
在AppDelegate的DidFinishLaunching中。
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
    [self.window setBackgroundColor:[UIColor whiteColor]];

每个视图控制器中

- (UIStatusBarStyle) preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}

这个答案并不是很好。我已经完全按照这个做了,但完全没有帮助。这更像是iPhone 6的一个bug。除此之外,如果你将“View Controller Based Status Bar”设置为NO,在每个视图控制器中返回首选状态栏样式有什么用呢? - Legoless
6
对我来说起作用了,但是如果你在info.plist中明确指定属性不是基于视图控制器的,那么在每个视图控制器中添加preferredStatusBarStyle没有意义。我也不需要设置窗口背景颜色。 - manecosta
4
好的,我会尽力进行翻译。以下是需要翻译的内容:Worked for me but only needed first line - josef
需要在这里添加第二行(每个视图控制器中的代码)。 - Omar Sultan

42

只有当您的应用程序被缩放以适应较新设备的分辨率时,才会出现此错误。

一个快速的解决方法(谁知道这是否会在8.1得到解决)是在您的应用程序包中提供正确分辨率的加载图像。

来自https://developer.apple.com/ios/human-interface-guidelines/graphics/launch-screen/

For iPhone 7, iPhone 6s, iPhone 6:

750 x 1334 (@2x) for portrait
1334 x 750 (@2x) for landscape

For iPhone 7 Plus, iPhone 6s Plus, iPhone 6 Plus:

1242 x 2208 (@3x) for portrait
2208 x 1242 (@3x) for landscape

在我的应用程序中,我们仅支持竖屏,因此提供了750x1334和1242x2208的解决方案。

并且为了确认,如果不明显的话,您需要使用UIStatusBarStyleLightContent来设置状态栏样式。


1
我尝试了这个解决方案,但我仍然看到了@CMash所描述的问题。 - cthomaschase
编辑:不确定新的启动图像是否被识别,但在我将它们添加到info.plist的UILaunchImages部分后,这个解决方案起作用了。 - cthomaschase
1
另外,正如我在我的答案中所指出的那样,您可以使用新的启动图像nibs,这肯定会解决问题! - CMash
5
为了适当加载分辨率图片,你很可能需要重新设计用户界面,因为它不再是320x568点坐标系统——除非第一次就完美地布局好了!对于其他想要应用程序按比例缩放和使用UIStatusBarStyleLightContent样式的人来说,这样做不起作用... - OpenUserX03
@Aaron Wasserman,在我的项目中,我隐藏了整个应用程序的状态栏,因此我配置了Info.plist(StatusBar Is Initially Hidden=YES & View-Controller Based...=NO)。当我从我的应用程序打开ImagePickerController时,状态栏会显示,然后它不会隐藏。(注意:这个问题只出现在iPhone 6和6+模拟器上,而不是在iPhone 4和5上)。谢谢。 - Divyesh Dobariya
使用 iPhone 6 的缩放版本来修复错误可能有其原因,因此停止使用它并不是一个好的解决方法。 - manecosta

16

我的应用在 iOS 7 中的状态栏通过项目/目标设置可以正常工作:

Status bar style = UIStatusBarStyleLightContent

View controller-based status bar appearance = NO

但在 iOS 8 中(iPhone 6 和 iPhone 6 Plus 模拟器上),状态栏没有显示出来。将“View controller-based status bar appearance”更改为 YES,然后添加:

    // Objective C
    - (UIStatusBarStyle) preferredStatusBarStyle {
         return UIStatusBarStyleLightContent;
    }
    //Swift
    override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
    }

将视图控制器返回到根视图控制器后,会再次看到白色状态栏,但仅限于初始根控制器启动之后。在初始启动期间,状态栏仍然是黑色的。


我在我的应用程序上尝试了这个功能,启动画面是黑色的,然后在闪屏后变为白色(在iOS 7上正常工作)。但是现在,它仍然以黑色启动 :( - CMash
这个问题可能也只限于iPhone 6型号,因为我看到的一些状态栏颜色问题在运行iOS 8的iPhone 5S上并没有发生... - CMash
@CMash - 是的 - 谢谢。我看到了同样的行为。我会编辑答案来澄清这一点。 - Tony Adams
@Tony:为什么不用Swift版本? - lee
@lee - 很好的问题!我已经编辑了答案,包括两个方面。谢谢! - Tony Adams

15
一个类似的答案(目前被投票为第2个)已经发布,但为了保持这篇文章的最新性,这里是Swift版本。
  1. 在info.plist文件中添加一个名为View controller-based status bar appearance的行,并将其布尔值设置为NO

  2. 在您的AppDelegate.swift文件中,添加以下方法: func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool { UIApplication.sharedApplication().statusBarStyle = .LightContent return true }

  3. 我不需要做这一步才能使它工作(即执行步骤1和2,它可能会起作用)。如果不起作用,请尝试将以下方法添加到每个ViewControllers中:

    override func preferredStatusBarStyle() -> UIStatusBarStyle { return UIStatusBarStyle.LightContent }

我希望这对你有所帮助,
Loic

1
非常有帮助!我只需要完成步骤1和2。 - mbuff24
不确定,但我在实际的iPhone 6/6Plus上测试时遇到了这个问题。其他型号没有发生这种情况...非常奇怪。我将故事板的状态栏样式设置为默认和浅色内容,但无济于事。这个方法有效。 - Alan
1
@Alan,故事板的状态栏样式实际上只是故事板中的一个可视化效果 - 即当应用程序实际运行时,它对状态栏没有影响。 - Loic Verrall
1
我在 iPad Pro 上遇到了同样的问题,由于无法为 iPad Pro 上传静态启动图像,因此无法使用第一个答案(而且我不能使用故事板启动文件,因为我没有使用自动布局)。在这里执行步骤1和2起作用了。谢谢! - Mohamed Hafez

7
  1. 打开 Info.plist
  2. 添加一个名为“View controller-based status bar appearance”的新属性(布尔类型),并将其值设置为“NO”
  3. 添加一个名为“Status bar style”的新属性(字符串类型),并将其值设置为“Opaque black style”

完成。


6

步骤1:打开您的应用程序的info.plist文件,并将UIViewControllerBasedStatusBarAppearance设置为NO

步骤2:在您的应用程序的info.plist文件中,将“状态栏样式”设置为UIStatusBarStyleLightContent


6
AppDelegate didFinishLaunchingWithOptions:方法中添加以下行:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:NO];

1
这个对我有用,但是UIStatusBarStyleBlackOpaque已经被弃用了,所以我现在使用的是:[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:NO]; - Rosswerks
如果您的应用支持所有这些iOS 6、7和8版本,则应使用“UIStatusBarStyleBlackOpaque”。 - Teja Kumar Bethina
对我也同样有效。我不必在每个页面上重写preferredStatusBarStyle。 - Oren
即使不更改启动图像并搞乱点坐标系统,这也可以正常工作。 - Stefan Arn

3

可能是模拟器出了问题。使用此选项可以覆盖默认状态栏或特定视图控制器的状态栏。

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
} //This is swift code

2

我知道使用分类重写基类的行为是不好的风格,但这样做可以解决问题,可能是最快的解决方案。

步骤1: 确保在您的应用程序 plist 文件中将 UIViewControllerBasedStatusBarAppearanceView controller-based status bar appearance 设置为 YES

步骤2:将以下代码添加到您的项目中:

@implementation UIViewController (StatusBarColorFix)

- (UIStatusBarStyle) preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}

@end

1

这里是有关状态栏/文本颜色更改的苹果指南/说明

以下是如何更改状态栏样式:

如果您想设置应用程序级别的状态栏样式,则在`.plist'文件中将UIViewControllerBasedStatusBarAppearance设置为NO

或者,您可以从应用程序代理程序编写代码进行更改:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    application.statusBarStyle = .lightContent
    return true
}

如果您想在视图控制器级别上设置状态栏样式,请按照以下步骤操作:
  1. 如果您只需要在UIViewController级别上设置状态栏样式,则在.plist文件中将UIViewControllerBasedStatusBarAppearance设置为YES。
  2. 在viewDidLoad中添加函数 - setNeedsStatusBarAppearanceUpdate

  3. 覆盖您的视图控制器中的preferredStatusBarStyle。

-

override func viewDidLoad() {
    super.viewDidLoad()
    self.setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

根据状态栏样式设置级别,设置.plist的值。 在此输入图片描述

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