UIAppearance tintColor имеет приоритет над раскадровкой tintColor - PullRequest
0 голосов
/ 08 ноября 2019

Я создал простой контроллер представления, используя Interface Builder, который содержит UIImageView и UIButton. На обоих из них я установил tintColor как пурпурный.

Interface Builder

В AppDelegate я установил UIView.appearance.tintColor как голубой.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    UIView.appearance.tintColor = UIColor.cyanColor;

    return YES;
}

При запуске приложения я получаю следующее:

Simulator

Это не имеет смысла для меня. Я ожидаю, что Magenta tintColor, указанный непосредственно в imageView и кнопке, переопределит Cyan tintColor.

Почему это происходит?

Для справки, я использую Xcode Version 11.2 (11B52).

Ответы [ 3 ]

0 голосов
/ 08 ноября 2019

UIImageView также наследуется от UIView , изменение внешнего вида UIView (родителя UIImageView) повлияет на все приложение. Если вы хотите переопределить внешний вид любого конкретного элемента пользовательского интерфейса, создайте IBOutlet и программно измените его только на этот элемент пользовательского интерфейса.

0 голосов
/ 14 ноября 2019

Оказывается, свойство tintColor не украшено UI_APPEARANCE_SELECTOR, поэтому его не следует использовать в прокси-серверах UIAppearance.

Даже если это работает, установка UIView.appearance.tintColor имеет побочные эффекты. Одним из примеров является эта проблема с раскадровками. Еще один случай, который я заметил, заключается в том, что в iOS 13 заголовки разделов UITableView будут заполнены заданным цветом.

Учитывая, что это не поддерживаемый сценарий, трудно точно сказать, почему попытка переопределить tintColor длякомпонент на раскадровке не работает. Снова проверяя документацию, я обнаружил примечание, которое может объяснить это, хотя:

iOS применяет изменения внешнего вида, когда представление входит в окно , это не меняет внешний видпосмотреть, что уже в окне. Чтобы изменить внешний вид представления, находящегося в данный момент в окне, удалите его из иерархии представлений и затем верните его обратно.

Я предполагаю, что tintColor для раскадровки будет установлен при загрузке раскадровки. объект, а затем UIKit перезапишет его с tintColor "UIAppearance", как только представление вставляется в иерархию представления.

Решение

Правильный способ установитьglobal tintColor, кажется, устанавливает его на основной UIWindow. Согласно комментариям в UIView.h, tintColor наследуется суперпредставлением. Это позволяет использовать глобальный tintColor для всех представлений и переопределять его локально, где это необходимо. Он работает как положено при установке свойства из раскадровки.

0 голосов
/ 08 ноября 2019

Программно установите tintColor в вашем классе ViewController.

...