Изменение цвета оттенков элементов в UINavigationbar (iOS 11)

Я использовал этот код для изменения цвета оттенка элемента в панели навигации:

UINavigationBar.appearance().tintColor = theme.labelColor

Однако это больше не работает в iOS 11. Перед iOS 11 кнопки на панели навигации были UINavigationButton s, но в iOS 11 они были изменены на _UIModernBarButton. Мне удалось изменить цвет оттенков с помощью UIButton.appearance().tintcolor, но это изменит каждую кнопку.

Здесь сравнение:

iOS 10 против 11 Кнопка UINavigationBar Кто-нибудь знает, как изменить цвет кнопки на панели навигации?

ОБНОВЛЕНИЕ 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];