【问题标题】:Status Bar showing black text, only on iPhone 6 iOS 8 simulator状态栏显示黑色文本,仅在 iPhone 6 iOS 8 模拟器上
【发布时间】:2014-11-10 05:26:56
【问题描述】:

我正在尝试在 Xcode 6 GM 中将我的 iOS 7 应用程序转换为 iOS 8,当我在 iPhone 5s 或更低版本的 iOS 8 模拟器上运行它时,一切都很好,但在 iPhone 6 和 6 Plus 模拟器上,状态栏有黑色文本,而不是像其他任何时候一样的白色。我已经通过 Xcode 将 Info.plist UIStatusBarStyle 设置为“透明黑色样式(0.5 的 alpha)”,这似乎在其他任何地方都有预期的效果。有什么想法吗?

(我还没有接触任何情节提要,这有什么关系吗?我希望我可以推迟一段时间:)

【问题讨论】:

  • 所以我遇到了同样的问题,在我的两个应用程序上略有不同:在一个应用程序上,它在启动屏幕期间开始为黑色,然后在 UI 加载后变为白色,如我所愿成为。在 iOS 7 上,它总是以白色正常启动。在另一个应用程序上,它在 iOS 8 上一直保持黑色,或者我是这么认为的。事实证明,在运行 iOS 8 的 iPhone 5S 上,它应该是白色的。在缩放的 UI iPhone 6 上它很好,但不是标准 UI。 iPhone 6 Plus 虽然总是黑色的,无论 UI 是缩放还是标准......我猜可能是 iOS 8 中的一个错误......

标签: ios ios8 statusbar uistatusbar iphone-6


【解决方案1】:

这就是我修复它的方法

在 PLIST 中 查看基于控制器的状态栏 NO 状态栏样式 UIStatusBarStyleLightContent

在 AppDelegate DidFinishLaunching 中

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
    [self.window setBackgroundColor:[UIColor whiteColor]];

在每个视图控制器中

- (UIStatusBarStyle) preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}

【讨论】:

  • 这个答案不是很好。我已经做到了这一点,它根本没有帮助。这更像是 iPhone 6 的 bug。除此之外,如果您将基于视图控制器的状态栏设置为否,那么在每个视图控制器中返回首选状态栏样式有什么好处?
  • 为我工作但是,如果您在 info.plist 中明确指出该属性不是基于视图控制器的,那么将 preferredStatusBarStyle 添加到每个视图控制器是没有意义的。我也不需要设置窗口背景颜色。
  • 为我工作,但只需要第一行
  • 这里需要第二行(每个视图控制器中的代码)
【解决方案2】:

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

一个快速解决方法(谁知道这是否会在 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 作为您的状态栏样式。

【讨论】:

  • 我尝试了这个解决方案,我仍然看到@CMash 描述的问题。
  • 编辑:不确定新的启动图像是否被识别,但在我将它们添加到 info.plist 的 UILaunchImages 部分后,此解决方案有效。
  • 您也可以使用我在回答中指出的新启动图像笔尖,这当然可以解决问题!
  • 添加正确分辨率的加载图像很可能需要您重新设计您的 UI,因为它不再是 320x568 点坐标系 - 除非您第一次完美布局!对于我们其他想要扩展应用程序和 UIStatusBarStyleLightContent 样式的人来说,这不会......
  • @Aaron Wasserman ,在我的项目中,我隐藏了整个应用程序的状态栏,所以我配置了 Info.plist(StatusBar 最初是隐藏的=YES 并且基于视图控制器...=NO)。当我从我的应用程序中打开 ImagePickerController,显示状态栏,然后它没有隐藏。(注意:此问题仅在 iPhone 6 和 6+ 模拟器上,但不在 iPhone 4 和 5 上)。谢谢
【解决方案3】:

仅使用项目/目标设置,我的应用程序的状态栏在 iOS 7 中运行良好:

Status bar style = UIStatusBarStyleLightContent

View controller-based status bar appearance = NO

但在 iOS 8(iPhone 6 和 iPhone 6 Plus 模拟器)中,状态栏没有出现。将基于视图控制器的状态栏外观更改为 YES,然后添加:

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

到 ViewController 导致再次看到白色状态栏,但仅在初始根控制器启动之后。在初始启动期间,状态栏保持黑色。

【讨论】:

  • 我在我的应用程序上尝试了这个,它启动黑色,然后在启动后变为白色(在 iOS 7 上工作正常),它仍然以黑色启动:(
  • 它也可能仅限于 iPhone 6 机型,因为我看到的一些状态栏颜色问题不会在运行 iOS 8 的 iPhone 5S 上发生...
  • @CMash - 是的 - 谢谢。我看到了同样的行为。我将编辑答案以澄清这一点。
  • @Tony:为什么“不是 swift 版本”?
  • @lee - 好问题!我已经编辑了答案以包括两者。谢谢!
【解决方案4】:

已经发布了一个类似的答案(目前被评为第 2 位),为了让这篇文章保持最新,请购买,这里是 Swift 版本。

  1. 在 info.plist 文件中添加一行,名为查看基于控制器的状态栏外观,并将其布尔值设置为 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 }

希望对你有帮助,

洛伊克

【讨论】:

  • 非常有帮助!我也只需要执行第 1 步和第 2 步
  • 不确定,但我在实际 iPhone 6/6Plus 上测试时遇到了这个问题。其他型号不会发生...非常奇怪。我将故事板的状态栏样式设置为默认和浅色内容,但无济于事。这行得通。
  • @Alan 故事板的状态栏样式实际上只是故事板中的一个可视化 - 即当应用程序实际运行时它对状态栏没有影响。
  • 我在 iPad Pro 上再次遇到同样的问题,并且由于您无法为 iPad Pro 上传静态启动图像,我无法使用第一个答案(而且我无法使用故事板启动文件因为我没有使用自动布局)。在这里执行步骤 1 和 2 有效。谢谢!
【解决方案5】:
  1. 打开 Info.plist
  2. 添加名为“View controller-based status bar appearance”(布尔值)的新属性并将其值设置为“NO”
  3. 添加名为“状态栏样式”(字符串)的新属性并将其值设置为“不透明黑色样式”

完成。

【讨论】:

    【解决方案6】:

    AppDelegatedidFinishLaunchingWithOptions:方法中加入下面一行

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:NO];
    

    【讨论】:

    • 这对我有用,但 UIStatusBarStyleBlackOpaque 已被弃用,所以我正在使用:[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:NO];
    • 如果您的应用支持所有这些 iOS 6、7 和 8 版本,那么您应该使用 'UIStatusBarStyleBlackOpaque'。
    • 同样对我有用。我不必在每个页面上都覆盖 preferredStatusBarStyle
    • 即使不更改启动图像和弄乱点坐标系也可以工作
    【解决方案7】:

    第 1 步:打开应用的 info.plist 文件并将 UIViewControllerBasedStatusBarAppearance 设置为 NO

    第 2 步:应用程序的 info.plist 文件并将“状态栏样式”设置为 UIStatusBarStyleLightContent

    【讨论】:

      【解决方案8】:

      模拟器可能有问题。使用它来覆盖特定视图控制器的默认状态栏或状态栏。

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

      【讨论】:

        【解决方案9】:

        我知道使用类别覆盖基类中的行为是一种不好的风格,但这很有效,并且可能是修复它的最快解决方案。

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

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

        @implementation UIViewController (StatusBarColorFix)
        
        - (UIStatusBarStyle) preferredStatusBarStyle {
            return UIStatusBarStyleLightContent;
        }
        
        @end
        

        【讨论】:

          【解决方案10】:

          一个很好的解决方法是使用 iPhone 6 机型上使用的新启动图像笔尖支持。似乎 iOS 8 中只有一个错误,这意味着 iPhone 6 型号在启动时没有正确检查状态栏样式,但如果您添加启动笔尖,它就会得到解决。

          正如 Aaron Wasserman 指出的,您还可以指定 iPhone 6 和 6+ 启动 PNG,这似乎也可以解决问题,只要您正确设置它们!

          【讨论】:

            【解决方案11】:

            这里是Apple Guidelines/Instruction,关于状态栏/文本颜色的变化。

            这里是 - 如何更改状态栏样式:

            如果你想设置状态栏样式,应用程序级别然后在你的`.plist'文件中设置UIViewControllerBasedStatusBarAppearanceNO

            或者您可以通过 App Delegate 以编程方式进行操作:

            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 的值。

            【讨论】:

              【解决方案12】:

              在您的 Storyboard 中选择您的根视图控制器并设置默认状态栏类型

              【讨论】:

                【解决方案13】:

                我已经执行了以下步骤,它们对我很有效,应该也适用于 iOS 8+。

                1) 在 Info.plist 中添加了属性查看基于控制器的状态栏外观 => NO
                2) 在 AppDelegate.m

                - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中添加以下代码
                    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
                    [self.window setBackgroundColor:[UIColor redColor]]; // Change color as per need.
                

                3) 覆盖ViewController中的方法

                - (UIStatusBarStyle) preferredStatusBarStyle {
                    return UIStatusBarStyleLightContent;
                }
                

                【讨论】:

                  【解决方案14】:

                  适用于 Swift 4 和 iOS 11

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

                  【讨论】:

                    猜你喜欢
                    • 2018-02-25
                    • 2019-10-24
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多