【问题标题】:UIStatusBarStyle not working in SwiftUIStatusBarStyle 在 Swift 中不起作用
【发布时间】:2014-08-05 18:55:53
【问题描述】:

我正在尝试将我的 Swift 应用程序中的状态栏颜色更改为白色,但我碰到了一堵砖墙。我有 3 个 ViewController,每个都嵌入在 NavigationController 中(这可能是问题吗?我已经尝试将代码放在 NavigationController 类中。)我已经在我的 AppDelegate 的 didFinishLaunchingWithOptions 中尝试了以下两段代码.swift 文件,但都不起作用。

application.statusBarStyle = .LightContent

UIApplication.sharedApplication().statusBarStyle = .LightContent

文档要说的只是 UIBarButtonStyle 是一个 Int 并给了我这个 enum sn-p 对我的实现完全没有帮助。

enum UIStatusBarStyle : Int {
    case Default
    case LightContent
    case BlackOpaque
}

我错过了什么?

【问题讨论】:

    标签: ios swift appdelegate uistatusbar xcode6


    【解决方案1】:

    你有两个选择。

    如果您想继续手动设置状态栏的样式,请继续执行您正在执行的操作,但您需要将以下键添加到您的 info.plist 文件中,其值为NO

    查看基于控制器的状态栏外观

    或者,如果您想继续使用基于视图控制器的状态栏外观,而不是设置应用程序的 statusBarStyle,而是覆盖您要为其指定状态栏样式的每个视图控制器中的 preferredStatusBarStyle 属性。

    斯威夫特 3

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
    

    斯威夫特 2

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

    【讨论】:

    • 我已经尝试过这段代码......但我只在第一个屏幕中获得白色状态栏..我没有获得其余屏幕的状态栏:(..有什么帮助吗?
    • 您必须将 plist 中的“基于控制器的状态栏外观”设置设置为 YES。
    • 只有当您想要使用基于视图控制器的状态栏外观时。
    • 在 iOS 10 (Swift 3.0) 中,它不再是方法而是属性。见:stackoverflow.com/questions/38862208/…
    • 一屏
    【解决方案2】:

    Swift 3.0

    在 AppDelegate.swift 中 didFinishLaunchingWithOptions

    UIApplication.shared.statusBarStyle = .lightContent
    

    Info.plist

    View controller-based status bar appearance -> NO
    

    斯威夫特 2.2

    在 AppDelegate.swift 中 didFinishLaunchingWithOptions

    UIApplication.sharedApplication().statusBarStyle = .LightContent
    

    Info.plist

    View controller-based status bar appearance -> NO
    

    【讨论】:

    • 这是完美的答案:)
    • 完美答案。简短而甜蜜。
    • 抱歉,这可能是最简单的答案,但绝对不是最好的:因为它只是将这种样式设置为应用程序中的所有视图控制器和任何视图控制器。引入该行为是为了实现更精细的控制并根据不同的视图控制器应用不同的设置(例如混合明暗内容)。
    • 这很奇怪 - 不是 Apple 文档所说的,但它确实有效。尝试了很多其他方法,包括有一个基于 UIViewController 的状态栏,但都没有奏效。
    【解决方案3】:

    你必须设置:

    navigationController.navigationBar.barStyle = .black

    文本将显示为白色

    【讨论】:

    • 谢谢!即使这个覆盖 func preferredStatusBarStyle() -> UIStatusBarStyle { return UIStatusBarStyle.LightContent } 也没有任何帮助,这确实有帮助:navigationController.navigationBar.barStyle = .BlackTranslucent navigationController.navigationBar.translucent = true
    • 谢谢!你拯救了我的一天。但是,不推荐使用 BlackTranslucent。因此,我使用了 navigationController.navigationBar.barStyle = .Black
    • override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } 完美配合。你只需要在viewDidLoad 中写下这一行就可以了。确保使用此解决方案保留 View controller-based status bar appearance = YES
    • 似乎有点矫枉过正......刚刚尝试过并在 Info.plist 文件中像这样工作:1.状态栏样式 -> UIStatusBarStyleLightContent 2.查看基于控制器的状态栏外观 -> 否跨度>
    • 进行此更改后,我的后退按钮消失了。
    【解决方案4】:

    对于 iOS9.x 和 Xcode7,只需将其放入 AppDelegate.swift

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    
        UINavigationBar.appearance().barStyle = .Black
    
    } 
    

    这会自动将 UINavigationController 中所有视图控制器的状态栏样式转换为 .Lightcontent

    (另外,从 Info.plist 中删除 View controller-based status bar appearance 以隐藏您可能也看到的警告!)

    【讨论】:

    • 谢谢。 iOS9 中似乎有一个严重的错误。这是我可以将初始 VC 中的状态栏变为白色的唯一方法。我什么都试过了。我会归档雷达。
    • preferredStatusBarStyle 返回 UIStatusBarStyleDefault 但不将特定视图控制器的 lightcontent 更新为 darkcontent 。 self.navigationController.navigationBar.barStyle=UIBarStyleDefault;在 viewWillAppear 为我工作。希望此评论对其他人有所帮助。
    • 请注意,在 Swift 3 中 UIStatusBarStyle 已更改为“.black”(小写 B)
    【解决方案5】:

    在 Swift 3 中,状态栏样式已更改为 UIViewController 中的计算属性,您可以像这样覆盖它:

    override var preferredStatusBarStyle: UIStatusBarStyle {
       return .lightContent //or default
    } 
    

    【讨论】:

      【解决方案6】:

      在 iOS 9 上,以下 (setStatusBarStyle) 已被弃用,如果您这样做,您将收到警告。

      UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
      

      如果您希望一次更改所有状态栏,请尝试将以下内容添加到您的 Info.plist。这也会使您的启动屏幕状态栏变白。而上面的代码不会。

      <key>UIStatusBarStyle</key>
      <string>UIStatusBarStyleLightContent</string>
      <key>UIViewControllerBasedStatusBarAppearance</key>
      <false/>
      

      【讨论】:

      • .plist 方法是正确的,但 setStatusBarStyle() 不是必需的。 'setStatusBarStyle(_:animated:)' 在 iOS 9.0 中已弃用:使用 -[UIViewController preferredStatusBarStyle]
      • @BillChan 感谢您的评论,但请阅读答案。我已经解释过“setStatusBarStyle”已被弃用。如果你想改变一个或另一个 viewControllers,你应该使用 preferredStatusBarStyle。 plist 方法适用于希望一次性更改所有视图控制器的人。这里没有对错。只是您需要实现的目标。
      • UIStatusBarStyle = UIStatusBarStyleLightContent(在 .plist 中)帮助我的应用启动时带有白色状态栏文本...谢谢!!!
      【解决方案7】:

      对我来说,在我添加之前,以上所有内容都不起作用:

      self.navigationController?.navigationBar.barStyle = .black;
      

      所以:

      1. .plist 中将UIViewControllerBasedStatusBarAppearance 设置为YES
      2. viewDidLoad 致电self.setNeedsStatusBarAppearanceUpdate();
      3. 覆盖首选状态栏样式
        override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
      4. 在覆盖的方法中,我还设置了navigationBar.barStyle 所以最终
        轻度内容:
        override var preferredStatusBarStyle: UIStatusBarStyle { self.navigationController?.navigationBar.barStyle = .black;//or default return .lightContent //or default }
        黑色内容使用默认

      来源来自herehere

      如果这不起作用,您可以尝试添加 UINavigationController extension:

      extension UINavigationController
      {
          override open var preferredStatusBarStyle: UIStatusBarStyle {
              if let lastVC = self.viewControllers.last
              {
                  return lastVC.preferredStatusBarStyle
              }
      
              return .default
          }
      }
      

      【讨论】:

      • 导航栏样式没有评论...但在 Swift 3、Xcode 8 中 - 这是唯一对我有用的解决方案。
      • 我注意到的唯一缺点是所有这些步骤都发生了变化,但没有动画
      【解决方案8】:

      奇怪,使用 Swift 3.1 和 XC8.2.1,但以上所有方法都不起作用。

      我所做的只是

      extension UINavigationController
      {
          override open var preferredStatusBarStyle: UIStatusBarStyle {
              get {
                  return .lightContent
              }
          }
      }
      

      没有 Plist,没有其​​他东西。 高温

      【讨论】:

      • 也适用于 Swift 4.2。
      【解决方案9】:

      在 Swift 3.0 中,您可以覆盖 ViewController 中的 getter 以实现基于视图控制器的状态栏外观:

      override var preferredStatusBarStyle: UIStatusBarStyle {
          get { return .lightContent }
      }
      

      【讨论】:

        【解决方案10】:

        不要编辑您的 Info.plist。将此添加到您的 ViewController.swift:

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

        【讨论】:

          【解决方案11】:

          步骤 1. 添加到 info.plist View controller-based status bar appearance -&gt; NO

          Step 2. 在需要更改状态栏颜色的方法中添加代码:

          UIApplication.shared.statusBarStyle = .lightContent //(or .default)
          setNeedsStatusBarAppearanceUpdate()
          

          关键代码行:setNeedsStatusBarAppearanceUpdate()

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-03-26
            • 1970-01-01
            • 2014-07-27
            • 2014-07-29
            • 2016-02-18
            • 2015-03-19
            • 2015-02-18
            • 2018-10-11
            相关资源
            最近更新 更多