iOS13:使用UINavigationBarAppearance时忽略NavigationBar BarStyle
iOS 13: NavigationBar BarStyle is ignored when using UINavigationBarAppearance
我有一个自定义颜色的导航栏,我需要确保将状态栏颜色设置为白色。在 iOS 13 之前,这很容易做到,这是来自 UIViewController 的代码片段,它很好地完成了这项工作:
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.barStyle = .black
}
我在 iOS13 中面临的问题是,我现在需要使用 NavigationBar 的 standardAppearance 和 scrollEdgeAppearance 来取消新 UIKit 中的强制背景透明度。虽然我能够使用 UINavigationBarAppearance() 将 NavigationBar 的文本和背景颜色设置为我需要的颜色,但它会将我的状态栏颜色恢复为黑色。这是一个重现问题的简单示例:
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.standardAppearance = UINavigationBarAppearance() // <--- This is the line that reverts my status bar colour back to black
self.navigationController?.navigationBar.barStyle = .black
}
我不确定这是我做错了什么还是 UIKit 错误?
编辑
通过将以下两个属性添加到我的 Info.plist 文件中,终于设法解决了这个问题:
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
我很难学到它,但是,
"It isn't enough to just create an instance of UINavigationBarAppearance
. "您必须在 UINavigationBar 实例上实际设置它。
这实际上不是我说的,我是在堆栈溢出的线程上找到的,我找过它,但找不到。但是,在上下文中应该对您有帮助的内容如下。
//Using this we have to first set up the appearance.
UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
appearance.titleTextAttributes = @{NSFontAttributeName: font};
//Then u have to use it on the navigation bar and if needed on scroll Edge
yourNavigationBar.standardAppearance = appearance;
yourNavigationBar.scrollEdgeAppearance = appearance;
if you want this globally in your navigation bars
UINavigationBar.appearance.standardAppearance = appearance;
另一个 'hack ' 是将其添加到 Appdelegate 中,这将适用于您应用中的所有导航栏。
在 Appdelgate
func configureGlobalUI() {
UINavigationBar.appearance().barTintColor = .red
}
在didFinishLaunching
中调用
我终于设法将整个应用程序的状态栏样式设置为白色。 SO 上有很多解决方案,但根据我的经验,其中一些可能非常 iOS 具体,即对 iOS 8-12 的某人有用的东西不一定意味着它会在 [=18] =]iOS 13 与 Xcode 11.
这是我的解决方案,适用于 iOS 13 和 Xcode 11(也在设备上测试过运行 iOS 12 用于向后兼容)和 UINavigationBar.appearance().standardAppearance = UINavigationBarAppearance()。在 Info.plist 文件中添加以下两个属性:
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
深色模式的更改包括名为 overrideUserInterfaceStyle
的新 UIView
和 UIViewController
属性。这是指示您想要特定 light/dark 样式而不是我们响应当前黑暗模式状态的默认行为的首选方式。
如果您在导航栏或导航控制器上设置此项,那么您应该会得到预期的行为(假设您希望到处都是亮或暗)。如果您需要更多控制,那么将 UINavigationController
子类化以更改其行为可能更有意义(例如,通过覆盖 childViewControllerForStatusBarStyle
并返回顶视图控制器)。
我有一个自定义颜色的导航栏,我需要确保将状态栏颜色设置为白色。在 iOS 13 之前,这很容易做到,这是来自 UIViewController 的代码片段,它很好地完成了这项工作:
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.barStyle = .black
}
我在 iOS13 中面临的问题是,我现在需要使用 NavigationBar 的 standardAppearance 和 scrollEdgeAppearance 来取消新 UIKit 中的强制背景透明度。虽然我能够使用 UINavigationBarAppearance() 将 NavigationBar 的文本和背景颜色设置为我需要的颜色,但它会将我的状态栏颜色恢复为黑色。这是一个重现问题的简单示例:
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.standardAppearance = UINavigationBarAppearance() // <--- This is the line that reverts my status bar colour back to black
self.navigationController?.navigationBar.barStyle = .black
}
我不确定这是我做错了什么还是 UIKit 错误?
编辑
通过将以下两个属性添加到我的 Info.plist 文件中,终于设法解决了这个问题:
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
我很难学到它,但是,
"It isn't enough to just create an instance of UINavigationBarAppearance
. "您必须在 UINavigationBar 实例上实际设置它。
这实际上不是我说的,我是在堆栈溢出的线程上找到的,我找过它,但找不到。但是,在上下文中应该对您有帮助的内容如下。
//Using this we have to first set up the appearance.
UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
appearance.titleTextAttributes = @{NSFontAttributeName: font};
//Then u have to use it on the navigation bar and if needed on scroll Edge
yourNavigationBar.standardAppearance = appearance;
yourNavigationBar.scrollEdgeAppearance = appearance;
if you want this globally in your navigation bars
UINavigationBar.appearance.standardAppearance = appearance;
另一个 'hack ' 是将其添加到 Appdelegate 中,这将适用于您应用中的所有导航栏。
在 Appdelgate
func configureGlobalUI() {
UINavigationBar.appearance().barTintColor = .red
}
在didFinishLaunching
我终于设法将整个应用程序的状态栏样式设置为白色。 SO 上有很多解决方案,但根据我的经验,其中一些可能非常 iOS 具体,即对 iOS 8-12 的某人有用的东西不一定意味着它会在 [=18] =]iOS 13 与 Xcode 11.
这是我的解决方案,适用于 iOS 13 和 Xcode 11(也在设备上测试过运行 iOS 12 用于向后兼容)和 UINavigationBar.appearance().standardAppearance = UINavigationBarAppearance()。在 Info.plist 文件中添加以下两个属性:
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
深色模式的更改包括名为 overrideUserInterfaceStyle
的新 UIView
和 UIViewController
属性。这是指示您想要特定 light/dark 样式而不是我们响应当前黑暗模式状态的默认行为的首选方式。
如果您在导航栏或导航控制器上设置此项,那么您应该会得到预期的行为(假设您希望到处都是亮或暗)。如果您需要更多控制,那么将 UINavigationController
子类化以更改其行为可能更有意义(例如,通过覆盖 childViewControllerForStatusBarStyle
并返回顶视图控制器)。