如何防止iOS 13的黑暗模式更改应用程序状态栏中的文本颜色?

问题描述 投票:9回答:8

我的导航栏有一个white backgroundColor,而我的状态栏使用了dark textColor。当用户将iOS主题更改为暗模式时,状态栏将在white背景上更改为white文本。结果,我什么也看不到。如何为我的应用禁用此更改?

statusbar ios13 ios-darkmode
8个回答
24
投票
[UINavigationControllerUIViewController的子类(谁知道🙃)!

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

以下任何一种方法都可以使用:

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

    [preferredStatusBarStyledoc)-视图控制器的首选状态栏样式]

  • 子类或扩展UINavigationController
  • class MyNavigationController: UINavigationController { override var preferredStatusBarStyle: UIStatusBarStyle { .lightContent } }

    OR

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

  • childForStatusBarStyle中覆盖UINavigationController

    [childForStatusBarStyledoc)-当系统需要视图控制器用于确定状态栏样式时调用

    • 根据Apple的文档,
    • “如果您的容器视图控制器从其子视图控制器之一派生其状态栏样式,请[重写此属性]并返回该子视图控制器。如果返回nil或不重写此方法,则self的状态栏样式如果此方法的返回值发生更改,请调用setNeedsStatusBarAppearanceUpdate()方法。“
    • 换句话说,如果您不在此处实现解决方案3,则系统将退回到上述解决方案2。

    • 子类或扩展UINavigationController
    • class MyNavigationController: UINavigationController { override var childForStatusBarStyle: UIViewController? { topViewController } }

      OR

      extension UINavigationController {    
          open override var childForStatusBarStyle: UIViewController? {
              topViewController
          }
      }
      
    • 您可以返回上面想要的任何视图控制器。我建议以下之一:
    • [topViewControllerUINavigationController的)(doc)-导航堆栈顶部的视图控制器

      • [visibleViewController(of UINavigationController)(doc)-与导航界面中当前可见的视图关联的视图控制器(提示:这可以包括“以视图方式显示在导航控制器顶部的视图控制器本身“)
  • 注意:如果您决定继承UINavigationController,请记住通过IB中的身份检查器将该类应用于您的导航控制器。

    P.S。我的代码使用Swift 5.1语法😎


  • 9
    投票
    override var preferredStatusBarStyle: UIStatusBarStyle { if #available(iOS 13, *) { return .darkContent } else { return .default } }

    并调用setNeedsStatusBarAppearanceUpdate()方法


    4
    投票
    extension UIStatusBarStyle { static var black: UIStatusBarStyle { if #available(iOS 13.0, *) { return .darkContent } return .default } }

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

    override var preferredStatusBarStyle: UIStatusBarStyle {
        .black
    }
    

    3
    投票
    if #available(iOS 13.0, *) { navigationController?.navigationBar.overrideUserInterfaceStyle = .light }

    0
    投票
    如果您正在使用UINavigationController,请像这样在扩展名(或您自己的子类)中覆盖preferredStatusBarStyle(仅在视图控制器中覆盖preferredStatusBarStyle无效):

    extension UINavigationController { override open var preferredStatusBarStyle: UIStatusBarStyle { guard #available(iOS 13, *) else { return .default } return .darkContent } } 并且正如弗兰克所说,必须在UIViewControllerBasedStatusBarAppearance中将YES设置为info.plist


    0
    投票
    @interface MyNavigationController : UINavigationController ... @end @implementation MyNavigationController ... - (UIViewController *)childViewControllerForStatusBarStyle { return self.topViewController; } ... @end

    之后,您需要为每个控制器添加功能preferredStatusBarStyle。

    第二个选项是为所有控制器定义preferredStatusBarStyle函数。但是此函数不应位于根控制器中,而应位于UINavigationController的后代类中。

    @interface MyNavigationController : UINavigationController ... @end @implementation MyNavigationController ... - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } ... @end

    但是,即使在这种情况下,也必须为所有隐藏导航栏的控制器(如果有的话)定义函数preferredStatusBarStyle。


    0
    投票
    我具有切换功能,可根据显示的View Controller切换状态栏样式

    func toggleLight() { self.navigationBar.barTintColor = AppColors.White isDarkStyle = false setNeedsStatusBarAppearanceUpdate() }

    这里是最重要的部分

    override var preferredStatusBarStyle: UIStatusBarStyle {
    
            if #available(iOS 13.0, *) {
                return isDarkStyle ? .lightContent : .darkContent
            }
            return isDarkStyle ? .lightContent : .default
        }
    

    Where isDarkStyle表示导航栏背景颜色为深色或浅色。如果颜色较暗,则文本(内容)应为浅色;如果颜色较浅,则文本(内容)应为默认色,或从iOS 13开始为黑暗。

    总结:.lightContent, .darkContent显示独立于暗模式,如预期的那样。虽然.default容易受到黑暗模式更改的影响!


    0
    投票
    © www.soinside.com 2019 - 2024. All rights reserved.