iOS 11 中忽略设置 UINavigationBar 外观
Setting UINavigationBar appearance ignored in iOS 11
我正在尝试设置屏幕之间的 UINavigationBar 外观(tintColor
、barTintColor
等),但目前在 iOS 11 中,大部分似乎都被完全忽略了或者没有按预期运行。当推送或弹出视图时,单个导航控制器内的栏外观会发生变化。我有两个函数,我在 viewWillAppear
.
中调用它们
我需要能够设置标题颜色、左右栏按钮项目颜色、后退按钮颜色和栏色调颜色。
我现在正在尝试让颜色正常工作,所以我尝试了这个,但没有成功。
public func setDarkHeaderStyle() {
UIApplication.shared.statusBarStyle = .lightContent
UINavigationBar.appearance().tintColor = UIColor.white
UINavigationBar.appearance().barTintColor = Colours.secondaryNavy
UINavigationBar.appearance().isTranslucent = false
}
public func setLightHeaderStyle() {
UIApplication.shared.statusBarStyle = .default
UINavigationBar.appearance().tintColor = Colours.primaryNavy
UINavigationBar.appearance().barTintColor = UIColor.white
UINavigationBar.appearance().isTranslucent = false
}
如果我改为使用导航控制器来设置颜色,它确实适用于栏色调、UIBarButtonItem
和后退按钮,但标题不正确。
public func setDarkHeaderStyle() {
UIApplication.shared.statusBarStyle = .lightContent
navigationController?.navigationBar.tintColor = UIColor.white
navigationController?.navigationBar.barTintColor = Colours.secondaryNavy
navigationController?.navigationBar.isTranslucent = false
}
public func setLightHeaderStyle() {
UIApplication.shared.statusBarStyle = .default
navigationController?.navigationBar.tintColor = Colours.primaryNavy
navigationController?.navigationBar.barTintColor = UIColor.white
navigationController?.navigationBar.isTranslucent = false
}
所以我手动设置标题文本属性如下:
public func setDarkHeaderStyle() {
UIApplication.shared.statusBarStyle = .lightContent
navigationController?.navigationBar.titleTextAttributes = [
NSAttributedStringKey.font: UIFont(name: Fonts.fontRegularName, size: 16)!,
NSAttributedStringKey.kern: 0.2,
NSAttributedStringKey.foregroundColor: UIColor.white
]
navigationController?.navigationBar.tintColor = UIColor.white
navigationController?.navigationBar.barTintColor = Colours.secondaryNavy
navigationController?.navigationBar.isTranslucent = false
}
public func setLightHeaderStyle() {
UIApplication.shared.statusBarStyle = .default
navigationController?.navigationBar.titleTextAttributes = [
NSAttributedStringKey.font: UIFont(name: Fonts.fontRegularName, size: 16)!,
NSAttributedStringKey.kern: 0.2,
NSAttributedStringKey.foregroundColor: Colours.primaryNavy
]
navigationController?.navigationBar.tintColor = Colours.primaryNavy
navigationController?.navigationBar.barTintColor = UIColor.white
navigationController?.navigationBar.isTranslucent = false
}
这似乎可行,除了当您弹出回到根视图时未设置标题颜色:
我想我有两个问题:
为什么 UINavigationBar.appearance()
不起作用?
我怎样才能让它可靠地工作?
我认为这是一个错误。 UIBarNavigationItem
出于某种原因似乎忽略了您对其标题属性和色调颜色的更改,除非您的标题文本发生更改。这是一种奇怪的行为,您可以考虑报告它。一种解决方法是为您的标题切换一个空的 space 后缀:
// Hack!!! adds and removes an empty space to the title to
// force the bar item reset title attributes.
let title: String = barItem.title ?? ""
barItem.title = title.hasSuffix(" ") ? String(title.dropLast()) : title + " "
我尝试了一些适用于我的 UIViewController 的东西(全局和当前导航栏外观):
UINavigationBarAppearance* appearance = [[UINavigationBarAppearance alloc] init];
appearance.backgroundColor = bgColor;
appearance.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor whiteColor]};
[UINavigationBar appearance].standardAppearance = appearance;
[UINavigationBar appearance].scrollEdgeAppearance = appearance;
self.navigationController.navigationBar.standardAppearance = appearance;
self.navigationController.navigationBar.scrollEdgeAppearance = appearance;
我正在尝试设置屏幕之间的 UINavigationBar 外观(tintColor
、barTintColor
等),但目前在 iOS 11 中,大部分似乎都被完全忽略了或者没有按预期运行。当推送或弹出视图时,单个导航控制器内的栏外观会发生变化。我有两个函数,我在 viewWillAppear
.
我需要能够设置标题颜色、左右栏按钮项目颜色、后退按钮颜色和栏色调颜色。
我现在正在尝试让颜色正常工作,所以我尝试了这个,但没有成功。
public func setDarkHeaderStyle() {
UIApplication.shared.statusBarStyle = .lightContent
UINavigationBar.appearance().tintColor = UIColor.white
UINavigationBar.appearance().barTintColor = Colours.secondaryNavy
UINavigationBar.appearance().isTranslucent = false
}
public func setLightHeaderStyle() {
UIApplication.shared.statusBarStyle = .default
UINavigationBar.appearance().tintColor = Colours.primaryNavy
UINavigationBar.appearance().barTintColor = UIColor.white
UINavigationBar.appearance().isTranslucent = false
}
如果我改为使用导航控制器来设置颜色,它确实适用于栏色调、UIBarButtonItem
和后退按钮,但标题不正确。
public func setDarkHeaderStyle() {
UIApplication.shared.statusBarStyle = .lightContent
navigationController?.navigationBar.tintColor = UIColor.white
navigationController?.navigationBar.barTintColor = Colours.secondaryNavy
navigationController?.navigationBar.isTranslucent = false
}
public func setLightHeaderStyle() {
UIApplication.shared.statusBarStyle = .default
navigationController?.navigationBar.tintColor = Colours.primaryNavy
navigationController?.navigationBar.barTintColor = UIColor.white
navigationController?.navigationBar.isTranslucent = false
}
所以我手动设置标题文本属性如下:
public func setDarkHeaderStyle() {
UIApplication.shared.statusBarStyle = .lightContent
navigationController?.navigationBar.titleTextAttributes = [
NSAttributedStringKey.font: UIFont(name: Fonts.fontRegularName, size: 16)!,
NSAttributedStringKey.kern: 0.2,
NSAttributedStringKey.foregroundColor: UIColor.white
]
navigationController?.navigationBar.tintColor = UIColor.white
navigationController?.navigationBar.barTintColor = Colours.secondaryNavy
navigationController?.navigationBar.isTranslucent = false
}
public func setLightHeaderStyle() {
UIApplication.shared.statusBarStyle = .default
navigationController?.navigationBar.titleTextAttributes = [
NSAttributedStringKey.font: UIFont(name: Fonts.fontRegularName, size: 16)!,
NSAttributedStringKey.kern: 0.2,
NSAttributedStringKey.foregroundColor: Colours.primaryNavy
]
navigationController?.navigationBar.tintColor = Colours.primaryNavy
navigationController?.navigationBar.barTintColor = UIColor.white
navigationController?.navigationBar.isTranslucent = false
}
这似乎可行,除了当您弹出回到根视图时未设置标题颜色:
我想我有两个问题:
为什么 UINavigationBar.appearance()
不起作用?
我怎样才能让它可靠地工作?
我认为这是一个错误。 UIBarNavigationItem
出于某种原因似乎忽略了您对其标题属性和色调颜色的更改,除非您的标题文本发生更改。这是一种奇怪的行为,您可以考虑报告它。一种解决方法是为您的标题切换一个空的 space 后缀:
// Hack!!! adds and removes an empty space to the title to
// force the bar item reset title attributes.
let title: String = barItem.title ?? ""
barItem.title = title.hasSuffix(" ") ? String(title.dropLast()) : title + " "
我尝试了一些适用于我的 UIViewController 的东西(全局和当前导航栏外观):
UINavigationBarAppearance* appearance = [[UINavigationBarAppearance alloc] init];
appearance.backgroundColor = bgColor;
appearance.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor whiteColor]};
[UINavigationBar appearance].standardAppearance = appearance;
[UINavigationBar appearance].scrollEdgeAppearance = appearance;
self.navigationController.navigationBar.standardAppearance = appearance;
self.navigationController.navigationBar.scrollEdgeAppearance = appearance;