如何通过darkMode iOS 13禁用更改statusBar textColor

EvG*_*yin 5 uistatusbar ios13 ios-darkmode

我将whilebackgroundColor NavigationBardarktextColor用于statusBar,但是当用户将主题iOS更改为深色时,我的textColor statusBar更改为while,而while我的backgroundColor上NavigationBar则看不到任何东西。如何为我的应用禁用此更改?

And*_*rna 10

iOS 13解决方案

UINavigationControllerUIViewController(谁知道的)的子类!

因此,在呈现嵌入在导航控制器中的视图控制器时,您并不是真正在呈现嵌入式视图控制器。您正在展示导航控制器!UINavigationController,作为的子类UIViewController继承preferredStatusBarStylechildForStatusBarStyle,您可以根据需要设置。

以下任何一种方法都可以工作:

  1. 完全退出黑暗模式
    • 在中info.plist,添加以下属性:
      • 键- UIUserInterfaceStyle(又名“用户界面样式”)
      • 价值-轻
  2. preferredStatusBarStyle在内部覆盖UINavigationController

    • preferredStatusBarStyledoc)-视图控制器的首选状态栏样式
    • 子类或扩展 UINavigationController

      class MyNavigationController: UINavigationController {
          override var preferredStatusBarStyle: UIStatusBarStyle {
              .lightContent
          }
      }
      
      Run Code Online (Sandbox Code Playgroud)

      要么

      extension UINavigationController {
          open override var preferredStatusBarStyle: UIStatusBarStyle {
              .lightContent
          }
      }
      
      Run Code Online (Sandbox Code Playgroud)
  3. childForStatusBarStyle在内部覆盖UINavigationController

    • childForStatusBarStyledoc)-在系统需要视图控制器来确定状态栏样式时调用
    • 根据Apple的文件,

      “如果您的容器视图控制器从其子视图控制器之一派生其状态栏样式,请[覆盖此属性]并返回该子视图控制器。如果您返回nil或不重写此方法,则使用self的状态栏样式如果此方法的返回值发生更改,请调用setNeedsStatusBarAppearanceUpdate()方法。”

    • 换句话说,如果您未在此处实现解决方案3,则系统将退回到上述解决方案2。
    • 子类或扩展 UINavigationController

      class MyNavigationController: UINavigationController {
          override var childForStatusBarStyle: UIViewController? {
              topViewController
          }
      }
      
      Run Code Online (Sandbox Code Playgroud)

      要么

      extension UINavigationController {    
          open override var childForStatusBarStyle: UIViewController? {
              topViewController
          }
      }
      
      Run Code Online (Sandbox Code Playgroud)
    • 您可以返回上面想要的任何视图控制器。我建议以下之一:

      • topViewController(of UINavigationController)(doc)-导航堆栈顶部的视图控制器
      • visibleViewController(of UINavigationController)(doc)-与导航界面中当前可见视图相关联的视图控制器(提示:这可以包括“以模态形式显示在导航控制器本身顶部的视图控制器”)

注意:如果决定子类化UINavigationController,请记住通过IB中的身份检查器将该类应用于导航控制器。

PS我的代码使用Swift 5.1语法


Fra*_*gel 7

如果您将UIViewControllerBasedStatusBarAppearance应用程序的密钥设置info.plistYES,则可以在当前显示的视图控制器中覆盖状态栏样式:

override var preferredStatusBarStyle: UIStatusBarStyle {
    if #available(iOS 13, *) {
        return .darkContent
    } else {
        return .default
    }
}
Run Code Online (Sandbox Code Playgroud)


bux*_*xik 6

您可以将扩展名写入UIStatusBarStyle

extension UIStatusBarStyle {
    static var black: UIStatusBarStyle {
        if #available(iOS 13.0, *) {
            return .darkContent
        }
        return .default
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以轻松地在你的 ViewControllers 中使用:

override var preferredStatusBarStyle: UIStatusBarStyle {
    .black
}
Run Code Online (Sandbox Code Playgroud)