Оказывается, свойство tintColor
не украшено UI_APPEARANCE_SELECTOR
, поэтому его не следует использовать в прокси-серверах UIAppearance.
Даже если это работает, установка UIView.appearance.tintColor
имеет побочные эффекты. Одним из примеров является эта проблема с раскадровками. Еще один случай, который я заметил, заключается в том, что в iOS 13 заголовки разделов UITableView будут заполнены заданным цветом.
Учитывая, что это не поддерживаемый сценарий, трудно точно сказать, почему попытка переопределить tintColor
длякомпонент на раскадровке не работает. Снова проверяя документацию, я обнаружил примечание, которое может объяснить это, хотя:
iOS применяет изменения внешнего вида, когда представление входит в окно , это не меняет внешний видпосмотреть, что уже в окне. Чтобы изменить внешний вид представления, находящегося в данный момент в окне, удалите его из иерархии представлений и затем верните его обратно.
Я предполагаю, что tintColor для раскадровки будет установлен при загрузке раскадровки. объект, а затем UIKit перезапишет его с tintColor "UIAppearance", как только представление вставляется в иерархию представления.
Решение
Правильный способ установитьglobal tintColor, кажется, устанавливает его на основной UIWindow
. Согласно комментариям в UIView.h, tintColor наследуется суперпредставлением. Это позволяет использовать глобальный tintColor для всех представлений и переопределять его локально, где это необходимо. Он работает как положено при установке свойства из раскадровки.