Подкласс UILabel игнорирует foregroundColor в строке Attributed, когда метка использует именованный цвет - PullRequest
0 голосов
/ 01 ноября 2019

Я только что натолкнулся на очень странную проблему в пользовательском подклассе UILabel, и мне нужна помощь, чтобы выяснить, что происходит.

Вопрос, кажется, довольно длинный, но в основном это связано ск изображениям, которые я добавил, чтобы проиллюстрировать проблему как можно лучше: -)

Большое спасибо за вашу помощь!


Класс MyHTMLLabel использует awakeFromNib()метод для анализа его свойства text для HTML, такого как теги <hightlight>, для отображения текста между этими тегами в другом цвете.

Это работало без проблем в течение многих лет. Теперь я обновил свое приложение для поддержки темного режима iOS 13 и, таким образом, назначил именованные цвета всем элементам управления.

Если MyHTMLLabel назначен с именем Color , подсветка текста больше не работает. Полная метка отображается только в названном цвете. Если обычный цвет используется как раньше (выбран с помощью палитры цветов), все работает как прежде.


НО

Проблема возникает только в моем существующий проект . Я попытался проиллюстрировать проблему в новом проекте, но там все отлично работает ...

Точно такой же код и классы показывают разное поведение в моем существующем проекте и в демонстрационном проекте.

Таким образом, источник проблемы, кажется, скрыт где-то в моем существующем проекте, но я абсолютно не знаю, где ...


Что я пробовал:

  • Чтобы облегчить изучение проблемы, я удалил весь необходимый код из MyHTMLLabel. В результате получается класс MyLabel, который больше ничего не делает, чтобы заменить существующий текст цветным AttributedString в awakeFromNib()
  • . Я создал пустой TestViewController, который содержит только два MyLabel экземпляра. ,Один экземпляр использует обычный цвет , в то время как другой экземпляр использует именованный цвет
  • При представлении TestViewController в свежем демонстрационном проекте tвсе нормально: оба MyLabel s показывают цветной текст
  • При представлении TestViewController в моем существующем проекте только MyLabel с нормальным цветом показывает цветной текст, а текст с именованным цветом показывает только названный цвет

enter image description here enter image description here

class MyLabel: UILabel {

    override func awakeFromNib() {
        super.awakeFromNib()

        let customText = NSMutableAttributedString.init(string: "This is blue")
        customText.addAttribute(.foregroundColor, value: UIColor.blue, range: NSRange.init(location: 8, length: 4))

        attributedText = customText
    }

}

Наблюдения

  • Тесты были выполнены с использованием точно такого же кода как в демонстрационном проекте, так и в моем существующем проекте. Проблема обнаруживается только в моем существующем проекте. Таким образом, источник проблемы, кажется, скрыт где-то в моем существующем коде.
  • Существующий проект был создан 7 лет назад, работает в Objectiv-C и теперь также использует Swift. Естественно, есть тысячи отличий по сравнению с новым проектом. Проблема в том, что я понятия не имею, как искать единственное различие, которое вызывает проблему.
  • Проблема появляется только тогда, когда в awakeFromNib() назначена цветная атрибутивная строка. Если добавить другой метод, который запускается позже (например, при нажатии кнопки) и назначает цветную атрибутивную строку, он отображается просто отлично.
  • Таким образом, кажется, есть какая-то разницаво внутреннем процессе настройки основывается на том, используется ли нормальный или именованный цвет.

Любая идея или совет о том, как исследовать эту проблему дальше?

Я думал опереопределив все UILabel методы в MyLabel, чтобы увидеть, какие из них вызваны в процессе установки / инициализации, а какие первыми используют неправильный цвет. Однако кажется, что существует около ста методов, которые могут быть перезаписаны, и процесс будет очень громоздким?

Есть ли лучшая идея, как исследовать проблему дальше?

Спасибо большое!

...