gpt4 book ai didi

ios - 使用旧金山字体将 HTML 解析为 NSAttributedString? (iOS 9)

转载 作者:可可西里 更新时间:2023-11-01 04:41:09 25 4
gpt4 key购买 nike

我需要解析包含 <b> 的基本 HTML 字符串(粗体),<i> (斜体)和 <u> (下划线)标签,没有别的,只有那些简单的标签。

现在我只能得到 <u> (下划线)标记以在 NSAttributedString 中正确呈现, 当使用新的 San FranciscoiOS 9 .

我真的需要得到 <b> (粗体)和 <i> (斜体)也进行渲染。

这是我正在做的:

let text = "<i>Any</i> <b>Text</b> <u>that's basic HTML</u>"
let font = UIFont.preferredFontForTextStyle(UIFontTextStyleBody)

let modifiedFont = NSString(format:"<span style=\"font-family: '-apple-system','HelveticaNeue'; font-size: %f \">%@</span>",
font.pointSize, text) as String

let data = (modifiedFont as NSString).dataUsingEncoding(NSUTF8StringEncoding)

let attributedString = try? NSAttributedString(data: data!, options:
[ NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType,
NSCharacterEncodingDocumentAttribute : NSUTF8StringEncoding,
NSFontAttributeName : font ],
documentAttributes: nil)

但不幸的是 <i> (斜体)和 <b> (粗体)标签永远不会呈现,只有 <u> (下划线)正确呈现。

同样的方法也适用于 iOS 8Helvetica-Neue字体,但它不适用于新的 iOS 9 San Francisco字体

帮我弄<b> (粗体)和 <i> (斜体)在 NSAttributedString 中正确呈现!

更新:我也在整个应用程序中使用动态文本。这可能是事情无法正常工作的原因...

最佳答案

在应用中同时使用 NSAttributedStringDynamicType 是导致问题的原因。

事实证明,在收到 UIContentSizeCategoryDidChangeNotification 后,您需要重新解析/呈现您的 String。您不能保留 NSAttributedString,然后使用它来重置 UILabel 中的文本。您必须重新解析/呈现 NSAttributedString

简要示例:

public override func viewDidLoad() {
super.viewDidLoad()

//register be notified when text size changes.
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("didChangePreferredContentSize:"), name: UIContentSizeCategoryDidChangeNotification, object: nil)
}

// The action Selector that gets called after the text size has been changed.
func didChangePreferredContentSize(notification: NSNotification) {
self.myLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleSubheadline)
//
// DO NOT do this:
// self.myLabel.attributedText = self.myAlreadyRenderedText
//
//Make sure you re-render/parse the text into a new NSAttributedString.
//Do THIS instead:
self.myLabel.attributedText = self.renderAttributedText(str)
}

//Our method to render/parse the HTML tags in our text. Returns an NSAttributedString.
func renderAttributedText(str: String) -> NSAttributedString? {
let text = "<i>Any</i> <b>Text</b> <u>that's basic HTML</u>"
let font = UIFont.preferredFontForTextStyle(UIFontTextStyleBody)

let modifiedFont = NSString(format:"<span style=\"font-family: '-apple-system','HelveticaNeue'; font-size: %f \">%@</span>",font.pointSize, text) as String

let data = (modifiedFont as NSString).dataUsingEncoding(NSUTF8StringEncoding)

let attributedString = try? NSAttributedString(data: data!, options:
[ NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType,
NSCharacterEncodingDocumentAttribute : NSUTF8StringEncoding,
NSFontAttributeName : font ],
documentAttributes: nil)

return attributedString
}

deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}

关于ios - 使用旧金山字体将 HTML 解析为 NSAttributedString? (iOS 9),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33382733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com