iOS 13在UINavigationController中设置状态栏文本颜色

时间:2019-10-02 23:26:10

标签: ios xamarin.ios ios13

因此,在iOS 13之前,我设置了NavigationController.NavigationBar.BarStyle来控制状态栏中文本的颜色。但是现在有了新的UINavigationBarAppearance,有什么方法可以控制它吗?我已经尝试过覆盖PreferreddStatusBarStyle,并确保我的plist也包含该设置,但是据我所知,如果您的视图控制器位于UINavigationController内,则不可行。

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

我还试图将NavigationController.NavigationBar.BarStyle设置为UIBarStyle.Black。它是第一次使用,但是由于某种原因,当我返回并再次导航到页面时,设置BarStyle不再有效。

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

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

barStyle在有限的条件下仍然可以工作。您可以使用barStyle或UIBarAppearance,但不能同时使用两者;如果使用大标题,则不能使用barStyle。

当然,只需将UINavigationController子类化,就可以轻松解决问题。有点hacky,但是很容易。

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

期望在iOS 13中要做的是,不理会状态栏样式,而是让其根据用户界面样式(亮或暗模式)自动更改。在亮模式下使用亮条颜色,在暗模式下使用暗条颜色,一切都会很好。

答案 2 :(得分:0)

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

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

您可以通过以下方式更改StatusBar TextColor:

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

此外,该方法应在View全部加载后调用。 Apple从IOS 13中将UIController分开,这可能会影响PreferredStatusBarStyle在Controller中的外观。在解决此问题之前,可以使用UIApplication.SharedApplication.StatusBarStyle进行设置。