iOS 13:从UINavigationController内设置状态栏文字颜色

3
所以在 iOS 13 之前,我通过设置 NavigationController.NavigationBar.BarStyle 来控制状态栏中文本的颜色。但现在有了新的 UINavigationBarAppearance,是否有任何方法来控制它呢?我已经尝试覆盖 preferedStatusBarStyle,并确保我的 plist 包含此设置,但据我所知,如果您的视图控制器位于 UINavigationController 中,则不会生效。
因此,现在针对 iOS 13,我使用 UINavigationBarAppearance 设置我的导航栏外观,并设置 standardAppearance 和 scrollEdgeAppearance。
我还尝试将 NavigationController.NavigationBar.BarStyle 设置为 UIBarStyle.Black。它第一次起作用,但由于某种原因,当我返回并再次导航到该页面时,设置 BarStyle 不再产生任何效果。
什么是设置文本颜色的正确方法?
3个回答

3

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

当然,您可以通过子类化UINavigationController来轻松解决这个问题。这有点hacky,但很容易。

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

在iOS 13中,你应该让状态栏风格自动响应用户界面风格(浅色或深色模式),不要改变状态栏风格。在浅色模式下使用浅色状态栏颜色,在深色模式下使用深色状态栏颜色,这样一切都会很好。

1
谢谢你的回复,很遗憾这很难实现。然而,我仍然不明白为什么Apple要规定这种行为,尤其是当应用程序选择退出深色模式时。我相信还有一些情况下,状态栏应该是一种在浅色和深色模式下相同的固体颜色,并且你想要控制状态栏文本颜色的方式。是否有其他解决方法? - wpa

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))

0
Info.plist 文件中,如果添加了布尔属性 UIViewControllerBasedStatusBarAppearance 并将其值设置为 False
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

你可以按照以下方式更改状态栏文本颜色:

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

此外,该方法应在视图完全加载后调用。从IOS 13开始,苹果将UI与Controller分离,这可能会影响Controller中PreferredStatusBarStyle的外观。在解决此问题之前,您可以使用UIApplication.SharedApplication.StatusBarStyle进行设置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接