Изменить цвет ссылок 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 }
...