NSAttributedString 忽略 html 标签内的属性

问题描述

单词“TM”需要字体大小为 6px。

-- Answer:
--    lang    domain  person  count_distinct_urls
--    Hebrew  ynet.co.il  Naftali Bennet  1
--    Hebrew  ynet.co.il  Yair Lapid  1

我所做的,我将其转换为 AttributedString:

let newText = "My new Trade mark is MELLON<sup style="font-size:6px">TM</sup> Corporation"

而且进展顺利: before custom font

(字体大小为10时,匹配NSAtrString的认大小)

我必须将此文本与设计相匹配并为其添加自定义字体:

let htmltonSAttributedString = NSAttributedString(data: self,options: [.documentType: NSAttributedString.DocumentType.html,.characterEncoding: String.Encoding.utf8.rawValue],documentAttributes: nil)

并得到下一个结果: after custom font

因此自定义字体及其大小覆盖了标签的样式属性

我如何保留它们?

例如,我有这个工作: printed attributed String

我可以收回 NSAttributedStr 的确切部分的数据吗?所以我可以存储它,然后将零件重新添加在一起?

编辑

添加了更多代码以供参考

mutable.addAttributes([.font : font],range: NSMakeRange(0,mutable.length))

解决方法

@Larm 提出了解决这个问题的好主意:

迭代您的属性,并替换字体(使用新字体但使用当前字体大小)。

这就是我所做的:

mutable.enumerateAttributes(in: NSMakeRange(0,mutable.length),options: .longestEffectiveRangeNotRequired) { attrs,range,stop in
            if (attrs[.superscript] == nil) {
                mutable.addAttributes([.font : font],range: range)
            } else {
                let oldFont = attrs[.font] as? NSFont ?? font
                mutable.addAttributes([.font : NSFont(name: font.fontName,size: oldFont.pointSize) ?? font],range: range)
            }
        }

    }

我检查了 attr 是否具有与标签 NSSuperScript 对应的 <sup> 属性 如果是这样,我跳过了设置字体大小,而是只应用了新的字体样式

注意:标题还有一些问题,但在描述中一切都很好

New layout

当我修复它时,我会编辑这个答案