Изменение цвета оттенков элементов в UINavigationbar (iOS 11)
Я использовал этот код для изменения цвета оттенка элемента в панели навигации:
UINavigationBar.appearance().tintColor = theme.labelColor
Однако это больше не работает в iOS 11. Перед iOS 11 кнопки на панели навигации были UINavigationButton
s, но в iOS 11 они были изменены на _UIModernBarButton
. Мне удалось изменить цвет оттенков с помощью UIButton.appearance().tintcolor
, но это изменит каждую кнопку.
Здесь сравнение:
Кто-нибудь знает, как изменить цвет кнопки на панели навигации?
ОБНОВЛЕНИЕ 01/09/2017:
Похоже, что _UIButtonBarButton
имеет правильный цвет оттенков, но _UIModernBarButton
перезаписывает его с цветом, установленным для UIButton
.
ОБНОВЛЕНИЕ 18/09/2017:
"Инженерия предоставила следующие отзывы по этой проблеме:
UIView.tintColor не является селектором видимости и, в частности, документирован как неправильно работающий как свойство внешнего вида из-за его свойств наследования.
Ответы
Ответ 1
Итак, я нашел какое-то решение. Я устанавливаю цвет оттенка через внешний прокси-сервер для UIButton, но только когда он содержится в UINavigationBar. Похоже, он работает на меня. Однако все еще надеемся, что это поведение изменится в iOS 11 GM, или кто-то может придумать лучшее решение. Вот мой рабочий код:
if([UIButton respondsToSelector:@selector(appearanceWhenContainedInInstancesOfClasses:)]) {
[[UIButton appearanceWhenContainedInInstancesOfClasses:@[UINavigationBar.class]]setTintColor:navTintColor];
}
Быстрая версия вызова прокси-сервера:
UIButton.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).tintColor = UIColor.red
Ответ 2
Вы могли бы сделать
[[NSClassFromString(@"_UIModernBarButton") appearance] setTintColor:[UIColor redColor]];
это работает, но вы покалываете с помощью частного класса (это не приведет к отказу)
также вы можете иметь свой собственный подкласс UINavigationController и использовать его только там, где вам нужно
[[UIButton appearanceWhenContainedInInstancesOfClasses:@[MyNavigationController.class]] setTintColor:[UIColor redColor]];
Ответ 3
У меня была та же проблема с кнопкой "Назад" в навигационной панели, которая не является цветом, который я установил для 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];