更改NSAttributedString html链接颜色

时间:2016-11-30 16:21:25

标签: ios nsattributedstring asyncdisplaykit

尝试显示ASTextNode(与AsyncDisplayKit中的UILabel相同)以显示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))

所以我的标签上有我的字体,没关系,问题是我无法更改标签的链接颜色,它是我想要的系统蓝色。

我知道如何更改链接'颜色?

感谢。

4 个答案:

答案 0 :(得分:1)

好吧,伙计们,我找到了一种丑陋的方式来做到这一点。

将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)
                    }
                }
            }

答案 1 :(得分:0)

可以通过以下方式更改链接颜色。以下示例将演示:

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即可。它具有linkAttributesactiveLinkAttributes属性,您可以使用它来实现所需的行为,而无需使用UITextView

如果有效,请告诉我。随意建议编辑以使其更好:)

答案 2 :(得分:0)

我在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

}

答案 3 :(得分:0)

链接颜色是属性字符串的默认设置。可以使用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 }
        ...