在UINavigationbar(iOS 11)中更改元素的色调颜色

时间:2017-08-26 08:41:40

标签: swift uibutton uinavigationbar uibarbuttonitem ios11

我一直在使用此代码更改导航栏中元素的色调颜色:

UINavigationBar.appearance().tintColor = theme.labelColor

但是,这已不再适用于iOS 11.在iOS 11之前,导航栏中的按钮为UINavigationButton,但在iOS 11中,它们已更改为_UIModernBarButton。我可以使用UIButton.appearance().tintcolor更改其色调颜色,但这会更改每个按钮。

这是一个比较:

iOS 10 Vs. 11 UINavigationBar button 任何人都知道如何更改导航栏中的按钮色调颜色?

更新01/09/2017: 看似_UIButtonBarButton具有正确的色调颜色,但_UIModernBarButton会使用UIButton的颜色集覆盖它。

更新18/09/2017:

"工程部就此问题提供了以下反馈:

UIView.tintColor不是外观选择器,由于其继承属性,特别记录为外观属性不正常。"

4 个答案:

答案 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];