【问题标题】:iOS 13 Setting status bar text color from within UINavigationControlleriOS 13 从 UINavigationController 中设置状态栏文本颜色
【发布时间】:2020-02-01 06:22:21
【问题描述】:

所以在 iOS 13 之前,我设置 NavigationController.NavigationBar.BarStyle 来控制状态栏中文本的颜色。但是现在有了新的 UINavigationBarAppearance,有没有办法控制它?我已经尝试过覆盖preferedStatusBarStyle,并确保我的plist 也包含该设置,但据我所知,如果您的视图控制器位于UINavigationController 内,这将不被尊重。

所以现在对于 iOS 13,我正在使用 UINavigationBarAppearance 设置导航栏的外观并设置 standardAppearance 和 scrollEdgeAppearance。

我也在尝试将 NavigationController.NavigationBar.BarStyle 设置为 UIBarStyle.Black。它第一次工作,但由于某种原因,当我返回并再次导航到页面时,设置 BarStyle 不再有任何效果。

设置文本颜色的正确方法是什么?

【问题讨论】:

    标签: ios xamarin.ios ios13


    【解决方案1】:

    您可以使用此扩展程序更改状态栏文本颜色:

    extension UIApplication {
    
        enum ColorMode {
            case dark, light, customColorLowerThanIOS13(_ color: UIColor)
        }
    
        func setStatusBarTextColor(_ mode: ColorMode) {
            if #available(iOS 13.0, *) {
                guard let appDelegate = delegate as? AppDelegate else { return }
    
                var style: UIUserInterfaceStyle
    
                switch mode {
                    case .dark:
                        style = .dark
                    default:
                        style = .light
                }
    
                appDelegate.window?.overrideUserInterfaceStyle = style
            } else {
                if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
                    var color: UIColor
    
                    switch mode {
                        case .dark:
                            color = .white
                        case .light:
                            color = .black
                        case .customColorLowerThanIOS13(let customColor):
                            color = customColor
                    }
    
                    statusBar.setValue(color, forKey: "foregroundColor")
                }
            }
        }
    
    }
    

    使用:

    UIApplication.shared.setStatusBarTextColor(.dark)
    UIApplication.shared.setStatusBarTextColor(.light)
    UIApplication.shared.setStatusBarTextColor(.customColorLowerThanIOS13(.red))
    

    【讨论】:

      【解决方案2】:

      在Info.plist中,如果添加布尔属性UIViewControllerBasedStatusBarAppearance并将其值设置为False

      <key>UIViewControllerBasedStatusBarAppearance</key>
      <false/>
      

      您可以通过以下方式更改状态栏文本颜色:

      UIApplication.SharedApplication.SetStatusBarStyle(UIStatusBarStyle.LightContent, true);
      

      另外,这个方法应该在View加载完毕后调用。从 IOS 13 开始,Apple 将UI 与Controller 分开,这可能会影响PreferredStatusBarStyle 在Controller 中的外观。在处理这个问题之前,可以使用UIApplication.SharedApplication.StatusBarStyle进行设置。

      【讨论】:

        【解决方案3】:

        barStyle 在有限的条件下仍然有效。你可以使用 barStyle 或 UIBarAppearance 但不能同时使用,如果你使用大标题,你不能使用 barStyle。

        当然你可以简单地通过继承 UINavigationController 来解决这个问题。有点hacky,但很容易。

        override var childForStatusBarStyle : UIViewController? {
            return self.topViewController
        }
        

        您在 iOS 13 中期望做的事情是不理会状态栏样式,让它自动更改以响应用户界面样式(浅色或深色模式)。在亮模式下使用光条颜色,在暗模式下使用暗条颜色,一切都会好起来的。

        【讨论】:

        • 感谢您的回复,遗憾的是很难意识到这一点。但是,我仍然不明白为什么 Apple 规定了这种行为,尤其是在应用程序选择退出暗模式的情况下。我确信仍然有一个目的,栏应该是在明暗模式下相同的纯色,并且您想要控制状态栏文本颜色。有没有其他办法解决这个问题?
        猜你喜欢
        • 2020-01-26
        • 1970-01-01
        • 1970-01-01
        • 2020-11-18
        • 2020-01-16
        • 1970-01-01
        • 2019-11-01
        • 1970-01-01
        相关资源
        最近更新 更多