NightNight в Swift для смены темы, проблема с приписанным текстом - PullRequest
0 голосов
/ 15 ноября 2018

Я в настоящее время экспериментирую с 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?

Заранее спасибо!

...