UIAppearance перезаписывает пользовательский textColor на UILabel - PullRequest
0 голосов
/ 30 ноября 2018

Я устанавливаю внешний вид UILabel в моем делегате приложения, используя:

UILabel.appearance().textColor = UIColor.white

У меня также есть собственный подкласс UIView, который содержит UILabel вместе с некоторыми другими элементами (здесь опущено):

@IBDesignable
class CustomView: UIView {
    private let descriptionLabel = HCLabel()

    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        self.setup()
    }

    private func setup() {
        self.descriptionLabel.textColor = UIColor.black

        // ... other things not related to descriptionLabel
    }
}

Если я создаю CustomView в раскадровке, все работает просто отлично.Однако, если я создаю его экземпляр в коде, описаниеLabel будет белым (цвет внешнего вида), а не черным (цвет, который я установил).Что тут происходит?Насколько я понял, если установить собственный цвет, цвет внешнего вида не будет использоваться.

1 Ответ

0 голосов
/ 01 декабря 2018

То, что вы испытываете, зависит только от точного времени, в течение которого прокси-сервер UIAppearance применяет свои настройки к новому UIView.Когда мы должны предполагать, что это делает это?Он не может сделать это до init, потому что init - это первое, что происходит в жизни UIView.Таким образом, порядок событий выглядит следующим образом:

override init(frame: CGRect) {
    super.init(frame: frame)
    setup() // black
}
// and some time later, UIAppearance proxy comes along and sets it to white

Итак, ваша цель - позвонить на setup довольно рано в жизни лейбла - и, конечно же, прежде чем пользователь когда-либо сможет его увидеть -но не так рано , что прокси-сервер UIAppearance действует позже .Давайте переместим вызов на setup чуть позже в жизни лейбла:

// some time earlier, UIAppearance proxy sets it to white
override func didMoveToSuperview() {
    setup() // black
}

Теперь мы действуем после у прокси внешнего вида был шанс действовать,и поэтому ваши настройки действуют последними, и они выигрывают день.

Мы остаемся в неведении относительно как рано мы могли бы перевести вызов на setup и все же прийти после настройка внешнего вида прокси была соблюдена.Если у вас есть время, вы можете поэкспериментировать с этим.Например, willMoveToSuperview раньше;если вы позвоните туда setup (а не в didMoveToSuperview), это сработает?Поиграйте и узнайте!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...