Я в настоящее время экспериментирую с NightNight , простой в использовании библиотекой для добавления темных и светлых тем в приложение. Я рекомендую изучить его, если вы заинтересованы в добавлении двух тем в ваше приложение.
Это, как говорится, работает как шарм. Это еще не полностью поддерживается, например, Мне не хватает возможности установить shadowImage
из UITabBarController
для изменения "верхней границы" или разделителя, но, думаю, я могу добавить это позже, углубившись в источник.
Одна проблема, с которой я сейчас сталкиваюсь, заключается в том, что я не могу изменить цвет attributedText
для UITextView
. Мне определенно нужно использовать свойство attributedText
, потому что я хочу добавить lineHeightMultiple
. У меня все работает, но при переключении между темами цвет не меняется.
UITextView
является частью UICollectionViewCell
, поэтому он используется повторно. Всякий раз, когда я перезапускаю приложение или начинаю прокручивать в UICollectionView
, текст обновляется (иногда - из-за повторного использования, он иногда не обновляется, когда ячейка остается видимой на экране). Мне кажется, что мне нужно обновить или перезагрузить что-то еще, чтобы эта библиотека работала так, как мне нужно.
В настоящее время я настроил свой TextView так:
let customTextViewStyle = NSMutableParagraphStyle()
customTextViewStyle.lineHeightMultiple = 1.2
let attributedString = NSMutableAttributedString(string: "This is the text that will be shown inside the TextView")
attributedString.setMixedAttributes([NNForegroundColorAttributeName: MixedColor(normal: lightCustomTextViewFontColor, night: darkCustomTextViewFontColor)], range: NSRange(location: 0, length: attributedString.length))
attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value: customTextViewStyle, range: NSRange(location: 0, length: attributedString.length))
attributedString.addAttribute(NSAttributedString.Key.font, value: UIFont.systemFont(ofSize: normalFontSize), range: NSRange(location: 0, length: attributedString.length))
customTextView.attributedText = attributedString
Ниже приведен фрагмент исходного файла из NightNight , который называется NSMutableAttributedString, где добавлен наблюдатель:
public extension NSMutableAttributedString {
fileprivate struct AssociatedKeys {
static var mixedAttrsKey = "mixedAttrs"
}
fileprivate var mixedAttrs: [String: [NSRange: MixedColor]] {
get {
if let dict = objc_getAssociatedObject(self, &AssociatedKeys.mixedAttrsKey) as? [String : [NSRange : MixedColor]] {
return dict
}
self.mixedAttrs = [:]
MixedColorAttributeNames.forEach { (mixed) in
self.mixedAttrs[mixed] = [:]
}
return self.mixedAttrs
}
set {
objc_setAssociatedObject(self, &AssociatedKeys.mixedAttrsKey, newValue as AnyObject, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
addNightObserver(#selector(_updateTitleAttributes))
}
}
}
Тогда _updateTitleAttributes выглядит следующим образом:
@objc func _updateTitleAttributes() {
MixedColorAttributeNamesDictionary.forEach { (mixed, normal) in
if let foregroundColorDictionary = mixedAttrs[mixed] {
foregroundColorDictionary.forEach({ (range, mixedColor) in
self.addAttribute(normal, value: mixedColor.unfold(), range: range)
})
}
}
}
Я был бы очень признателен за решение этой проблемы, так как я сам не в состоянии понять это. Это как-то связано с источником - например, он не обновляется должным образом? Это как-то связано с моим UICollectionViewCell
?
Заранее спасибо!