我一直在使用此代码更改导航栏中元素的色调颜色:
UINavigationBar.appearance().tintColor = theme.labelColor
但是,这已不再适用于iOS 11.在iOS 11之前,导航栏中的按钮为UINavigationButton
,但在iOS 11中,它们已更改为_UIModernBarButton
。我可以使用UIButton.appearance().tintcolor
更改其色调颜色,但这会更改每个按钮。
这是一个比较:
更新01/09/2017:
看似_UIButtonBarButton
具有正确的色调颜色,但_UIModernBarButton
会使用UIButton
的颜色集覆盖它。
更新18/09/2017:
"工程部就此问题提供了以下反馈:
UIView.tintColor不是外观选择器,由于其继承属性,特别记录为外观属性不正常。"
答案 0 :(得分:16)
所以我确实找到了一种解决方案。我通过UIButton的外观代理设置色调颜色,但仅限于包含在UINavigationBar中。这看起来对我有用。但是仍然希望这种行为会在iOS 11 GM中发生变化,或者有人可以提出更好的解决方案。这是我的工作代码:
if([UIButton respondsToSelector:@selector(appearanceWhenContainedInInstancesOfClasses:)]) {
[[UIButton appearanceWhenContainedInInstancesOfClasses:@[UINavigationBar.class]]setTintColor:navTintColor];
}
Swift版本的外观代理调用:
UIButton.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).tintColor = UIColor.red
答案 1 :(得分:1)
非常感谢你们所有这些伟大的答案。对我来说,这就是诀窍:
[[UIButton appearance] setTintColor:someDefaultColorForAllButtons];
/**
* Starting with iOS 11, UIBarButtonItems actually have a UIButton subview.
* That means that the [UIButton appearance]'s tintColor will override whatever
* tintColor would normally be set or passed-through to the barButtonItem (usually
* the UINavigationBar's tintColor). That's why we un-set the tintColor for
* UIButton when it's contained in an instance of UINavigationBar.
*/
[[UIButton appearanceWhenContainedIn:UINavigationBar.class, nil] setTintColor:nil];
我们为应用中的所有UIButton
设置了自定义颜色(使用[[UIButton appearance] setTintColor:]
。通过这样做,我们永远无法更改任何tintColor
的{{1}}(在iOS 11上包括后退按钮。我试图在UIBarButtonItem
上设置tintColor
,直到我脸色发青:一切都无济于事。然后我发现了这个问题,最后指出了我在正确的方向(谢谢!)。
诀窍是这样:当UINavigationBar
中包含UIButton
tintColor
nil
时,将UINavigationBar
设置为UINavigationBar
。这样,UIBarButtonItem
的tintColor将传递到viewWillAppear:
,一切都将按预期工作。
现在,在我的self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
方法中,我可以简单地执行此操作:
UIBarButtonItem
我的所有{{1}},包括后退按钮都是白色的。
答案 2 :(得分:0)
你可以做到
[[NSClassFromString(@"_UIModernBarButton") appearance] setTintColor:[UIColor redColor]];
这是有效的,但是你正在和一个私人课程混在一起(这不会让你被拒绝)
你也可以拥有自己的UINavigationController子类,只在你需要的地方使用它
[[UIButton appearanceWhenContainedInInstancesOfClasses:@[MyNavigationController.class]] setTintColor:[UIColor redColor]];
答案 3 :(得分:0)
我遇到了同样的问题,导航栏中的后退按钮不是我为UINavigationBar设置的颜色:
[[UINavigationBar appearance] setBackgroundColor:COLOR_NAVIGATION_BG];
[[UINavigationBar appearance] setBarTintColor:COLOR_NAVIGATION_BG];
[[UINavigationBar appearance] setTintColor:COLOR_NAVIGATION_FOREG];
最后我得到了解决方案:
[[UIButton appearanceWhenContainedIn:[UINavigationBar class], nil] setTintColor:COLOR_NAVIGATION_FOREG];
此行设置导航按钮的颜色。
我还要补充一点,如果更改导航按钮的字体,则需要添加行来更改文本颜色:
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes: @{NSFontAttributeName:FONT_MAIN_NAVIGATION} forState:UIControlStateNormal];
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes: @{NSForegroundColorAttributeName:COLOR_NAVIGATION_FOREG} forState:UIControlStateNormal];