В настоящее время я работаю с UIAppearance над цветами всех моих розеток в моем проекте, что позволило мне создать свою собственную версию ночного режима «Сделай сам» в моем приложении для iOS.
образец :
UILabel.appearance().textColor = colorScheme.primaryColor
UILabel.appearance(whenContainedInInstancesOf: [MyController.self]).textColor = colorScheme.secondaryColor
...
Примечание: Colorscheme — это просто структура со всеми моими цветами, которые переключаются в зависимости от состояния .lightMode / .darkMode.
Недавно я создал подкласс UICollectionViewCell с UILabel внутри и хотел использовать тот же метод для определения цветов внутри него. Однако мне сложно понять как установить другой цвет для вложенного UILabel в зависимости от выбранного состояния ячейки.
Например :
// create a default UIView with specific backgroundColor
let selectedBackgroundView = UIView()
selectedBackgroundView.backgroundColor = colorScheme.selectedBackgroundColor
MyCollectionViewCell.appearance().backgroundColor = colorScheme.backgroundColor // default
MyCollectionViewCell.appearance().selectedBackgroundView = selectedBackgroundView // set specific view used when cell is selected
Этот вышеприведенный код отлично работает, когда я хочу установить разные цвета фона, когда выбран MyCollectionViewCell или нет, однако я хочу, чтобы вложенный UILabel также изменил свой fontColor, в зависимости от того, выбрана ячейка или нет. Есть ли правильный способ добиться этого с помощью UIAppearance?





Наконец нашел обходной путь для этой проблемы. Выкладываю свое решение, может кому поможет.
сначала я определяю цвет для textColor и highlightedTextColor
UILabel.appearance(whenContainedInInstancesOf: [MyCollectionViewCell.self]).textColor = colorScheme.color1
UILabel.appearance(whenContainedInInstancesOf: [MyCollectionViewCell.self]).highlightedTextColor = colorScheme.color2
Затем в MyCollectionViewCell я «привязываю» isSelected к UILabel isHighlighted:
class MyCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var myLabel: UILabel!
override var isSelected: Bool {
didSet {
self.myLabel.isHighlighted = isSelected
}
}
}
Работает безупречно.
Надеюсь, это может помочь кому-то