当前位置: 首页 > 面试题库 >

快速更改具有自己样式的HTML字符串上的字体

洪高刚
2023-03-14
问题内容

我正在从Wordpress
API上获取HTML字符串,并将其解析为属性字符串以在我的应用程序中显示它。由于字符串具有自己的样式,因此显示不同的字体和大小,这会影响我们的设计选择。

我想做的是在整个属性字符串上更改字体及其大小。

我尝试在属性字符串的选项中执行此操作,但是它没有任何作用:

let attributedT = try! NSAttributedString(
            data: nContent!.decodeHTML().data(using: String.Encoding.unicode, allowLossyConversion: true)!,
            options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSFontAttributeName: UIFont(name: "Helvetica", size: 16.0)!],
            documentAttributes: nil)
        contentLbl.attributedText = attributedT

是否有人对如何实现这一目标有任何想法?

PS我知道我可以在字符串的开头或结尾添加CSS标记,但这会覆盖其中的其他样式吗?另外,如果这是一个有效的解决方案,请您提供一个示例来说明如何做?


问题答案:

setAttributes将重置HTML中的所有属性。我写了一个扩展方法来避免这种情况:

斯威夫特4

public convenience init?(HTMLString html: String, font: UIFont? = nil) throws {
    let options : [NSAttributedString.DocumentReadingOptionKey : Any] =
        [NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.html,
         NSAttributedString.DocumentReadingOptionKey.characterEncoding: String.Encoding.utf8.rawValue]

    guard let data = html.data(using: .utf8, allowLossyConversion: true) else {
        throw NSError(domain: "Parse Error", code: 0, userInfo: nil)
    }

    if let font = font {
        guard let attr = try? NSMutableAttributedString(data: data, options: options, documentAttributes: nil) else {
            throw NSError(domain: "Parse Error", code: 0, userInfo: nil)
        }
        var attrs = attr.attributes(at: 0, effectiveRange: nil)
        attrs[NSAttributedStringKey.font] = font
        attr.setAttributes(attrs, range: NSRange(location: 0, length: attr.length))
        self.init(attributedString: attr)
    } else {
        try? self.init(data: data, options: options, documentAttributes: nil)
    }
}

测试样本:

let html = "<html><body><h1 style=\"color:red;\">html text here</h1></body></html>"
let font = UIFont.systemFont(ofSize: 16)

var attr = try NSMutableAttributedString(HTMLString: html, font: nil)
var attrs = attr?.attributes(at: 0, effectiveRange: nil)
attrs?[NSAttributedStringKey.font] as? UIFont
// print: <UICTFont: 0x7ff19fd0a530> font-family: "TimesNewRomanPS-BoldMT"; font-weight: bold; font-style: normal; font-size: 24.00pt

attr = try NSMutableAttributedString(HTMLString: html, font: font)
attrs = attr?.attributes(at: 0, effectiveRange: nil)
attrs?[NSAttributedStringKey.font] as? UIFont
// print: <UICTFont: 0x7f8c0cc04620> font-family: ".SFUIText"; font-weight: normal; font-style: normal; font-size: 16.00pt


 类似资料:
  • 问题内容: 此代码 给了我NSRange为TextView内部的字符串着色。问题是我只返回第一次出现。如果单词包含“ hi hihi hi”,则仅第一个“ hi”会被上色。如何获得所有出现的字符串? 问题答案: 斯威夫特5 迅捷3 迅捷2

  • 我必须使用itextpdf api创建一个pdf。我在这个项目中也有j汤api。我已经设法创建了一个pdf,它满足了所有的要求,除了一件事。pdf中的一列单元格必须从网络应用程序UI从html内容中获取它们的内容文本。所以,我把所有的标签和所有的标签都拿到了pdf。像这样: 现在我找到了一种通过使用Jsoup摆脱标记的方法。解析(cellContentText)。text(); 然而,现在没有线路

  • 问题内容: 我想将具有自定义样式的html字符串绑定到DOM。但是从字符串中删除样式。 例如: 在控制器中: 在DOM中: 将省略样式属性。结果将如下所示: 代替: 问题: 如何实现? 问题答案: 正如已经提到过的@Beyers,您必须使用,将其直接用于DOM中,您可以像这样在JS / controller部分中这样做: 在DOM / HTML部分

  • 问题内容: 我从html解析中得到一个字符串,即 我的代码是这样的 我不确定我的第二个拆分字符串应该是“’”还是“’,” 我希望我的结果是 问题答案: 我将使用正则表达式从这样的复杂输入中提取子字符串。 Swift 3.1: Swift 2.0:

  • 问题内容: 我有一个名为Memcached.Js的项目,它是Memcached服务器到Node.js的端口。 我一直在使用字符串和缓冲区进行比较,比较内存占用量和性能。对于内存,毫无疑问,缓冲区是正确的选择。 但令我惊讶的是,表演并非如此。执行字符串操作比使用缓冲区更快。这是我尝试的: 完整的代码在这里:https : //github.com/dalssoft/memcached.js/blob

  • 我认为每次更改字符串后,Python字符串的id都必须更改。但我发现真正的行为是不同的。例如,并非输出下面的所有代码字符串都不同: 这就是为什么我认为Python内核正在尝试优化代码,并开始对内存中的字符串进行奇怪的操作。该假设的另一个论点是,常量ID与大小为2的幂的段相关联: 但这其中还有一件奇怪的事。让我们看看随着字符串大小的增加,段大小会发生什么变化: 最后,我们可以尝试近似地将char添加