Изменить цвет ссылок NSAttributedString html

Попытка отобразить ASTextNode (такой же, как UILabel из AsyncDisplayKit) для отображения HTML-текста. Я просто должен установить текст на этикетке.

Вот как я работаю с моей строкой:

Используя это расширение, я преобразовываю текст HTML в NSAttributedString:

extension String {
    var html2AttributedString: NSAttributedString? {
        guard let data = data(using: .utf8) else { return nil }
        do {
            return try NSAttributedString(data: data, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch let error as NSError {
            print(error.localizedDescription)
            return  nil
        }
    }
    var html2String: String {
        return html2AttributedString?.string ?? ""
    }
}

Затем я установил детали своей этикетки:

 self.displayContent = NSMutableAttributedString(attributedString: content.html2AttributedString!)
 self.displayContent?.addAttribute(NSFontAttributeName, value: UIFont.fontMainFeedContentFont(), range: NSRange.init(location: 0, length: self.displayContent!.length))

Итак, у меня есть мой ярлык с моим шрифтом, и это нормально, проблема в том, что я не могу изменить цвета ссылок на моем ярлыке, это система синего цвета, которую я действительно хочу.

Любая идея, как я могу изменить цвета ссылок?

Благодарю.

2 ответа

Я нашел ответ на это в Swift 4.0

termsAndPolicyTextView.linkTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.red]

Полный код: Примечание: я не могу установить несколько цветов в одном textView.

    let attributedString = NSMutableAttributedString(string: termsAndPolicyText)

    attributedString.addAttribute(NSAttributedString.Key.link,
                                  value: "https://google.co.in",
                                  range: (termsAndPolicyText as NSString).range(of: "Terms or service")
    )

    attributedString.addAttribute(NSAttributedString.Key.link,
                                  value: "https://google.co.in", // Todo set our terms and policy link here
        range: (termsAndPolicyText as NSString).range(of: "Privacy & Legal Policy")
    )

    attributedString.addAttributes([NSAttributedString.Key.foregroundColor: UIColor.NMSTextColor(with: 0.6)],
                                   range: NSRange(location: 0, length: termsAndPolicyText.count))

    termsAndPolicyTextView.linkTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.termstextViewTextColor()]
    termsAndPolicyTextView.attributedText = attributedString
    termsAndPolicyTextView.textAlignment = .center

}

Хорошо, ребята, я нашел уродливый способ сделать это.

После преобразования html-текста в NSMutableAttributedString я просто зацикливаю все атрибуты, когда вижу атрибут "NSLink", просто добавляю атрибут для диапазона атрибута:

self.myString!.enumerateAttributes(in: NSRange(0..<myString!.length), options: []) { (attributes, range, _) -> Void in
                for (attribute, object) in attributes {
                    if attribute == "NSLink" {
                        print("Attribute = \(attribute) -- \(object)")
                        self.myString?.addAttribute(NSForegroundColorAttributeName, value: StyleKit.color_blue_bright, range: range)
                        self.myString?.addAttribute(NSUnderlineColorAttributeName, value: UIColor.clear, range: range)
                    }
                }
            }

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

let attributedText:NSMutableAttributedString = NSMutableAttributedString(string: "why?")
attributedText.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.styleSingle, range: NSMakeRange(0, attributedText.length))
attributedText.addAttribute(NSUnderlineColorAttributeName, value: UIColor.black, range: NSMakeRange(0, attributedText.length))
attributedText.addAttribute(NSForegroundColorAttributeName, value: UIColor.black, range: NSMakeRange(0, attributedText.length))

Кроме того, вы должны внести следующие изменения в UITextView это показывает это.

textView.linkTextAttributes = [NSForegroundColorAttributeName : UIColor.black]

Если вы не хотите использовать UITextView Для этого вы можете просто использовать TTTAttributedLabel. Она имеет linkAttributes а также activeLinkAttributes свойство, которое вы можете использовать для достижения желаемого поведения без использования UITextView,

Пожалуйста, дайте мне знать, если это работает или нет. Не стесняйтесь предлагать изменения, чтобы сделать это лучше:)

Цвет ссылок по умолчанию для атрибутированной строки. Можно указать с помощью css.

extension String {
    var html2AttributedString: NSAttributedString? {
        let html = """

<style type="text/css">
a, a:link, a:visited {
    color: inherit !important;
}
</style>
""" + self
        guard let data = html.data(using: .utf8) else { return nil }
        ...
Другие вопросы по тегам