更改 Swift NSAttributedString 的无序列表的字体

Changing Font for Unordered List for Swift NSAttributedString

我正在尝试从 HTML 字符串创建 NSAttributedString,但我必须更改字符串的字体。我能够通过以下方式成功实现这一目标:

let myOriginalString: String = "<!DOCTYPE html>
                    <head>
                      <style type=\"text/css\">
                        body{font-family: '-apple-system','Avenir-Medium',`Avenir-Black`; font-size:14;}
                      </style>
                    <body>
                      My HTML content
                    </body>"

let data: Data = myOriginalString.data(using: .utf8)

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

myConvertedString 呈现在屏幕上时,文本的字体是正确的。

但是当我尝试在 HTML 正文包含 无序列表 的情况下进行相同的转换时,无序列表中的内容不是我指定的格式:

let myOriginalString: String = "<!DOCTYPE html>
                    <head>
                      <style type=\"text/css\">
                        body{font-family: '-apple-system','Avenir-Medium',`Avenir-Black`; font-size:14;}
                      </style>
                    <body>
                      My HTML content
                      <ul>
                        <li>Item 1</li>
                        <li>Item 2</li>
                      </ul>
                    </body>"

let data: Data = myOriginalString.data(using: .utf8)

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

myConvertedString在屏幕上呈现时,字符串My HTML Content的格式是正确的,但是Item 1Item 2不是我指定的字体。

我试图为 ul 标签和 li 标签添加样式,但结果相同。

为什么 NSAttributedString 使用正确的字体呈现所有文本,除了无序列表?有没有更好的方法来使用 NSAttributedString 创建无序列表而不是使用 html?

我刚用 Arial 试了一下,效果很好:

override func viewDidLoad() {
        super.viewDidLoad()

        let myOriginalString = """
        <!DOCTYPE html>
        <head>
        <style type="text/css">
        body {
            font-family: Arial;
            font-size: 32px;
            color: red;
        }
        </style>
        <body>
        My HTML content
        <ul>
            <li>Item 1</li>
            <li>Item 2</li>
        </ul>
        </body>
        """

        if let data = myOriginalString.data(using: .utf8) {

            if let converted = try? NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil) {

                textView.attributedText = converted
            }
        }
    }

我找到了一个比使用 HTML 无序列表更好的解决方案,方法是改用 NSMutableParagraphStyle:

let myAttributedString = NSMutableAttributedString()

// Create a paragraph style
let paragraphStyle: NSMutableParagraphStyle = NSParagraphStyle.default.mutableCopy() as! NSMutableParagraphStyle
            paragraphStyle.tabStops = [NSTextTab(textAlignment: .left, location: 10, options: [:])]
            paragraphStyle.firstLineHeadIndent = 0
            paragraphStyle.headIndent = 10

let item1 =  NSMutableAttributedString(string: "\u{2022} Item1\n\n", attributes: [.font: UIFont.systemFont(ofSize: 14.0), .paragraphStyle: paragraphStyle])

let item2 =  NSMutableAttributedString(string: "\u{2022} Item2\n\n", attributes: [.font: UIFont.systemFont(ofSize: 14.0), .paragraphStyle: paragraphStyle])

myAttributedString.append(item1)
myAttributedString.append(item2)

现在 myAttributedString 以正确的字体和正确的样式打印出 item1item2(换行的单词与项目符号点的 minx 值不同)

我认为 HTML 部分出现了不正确的字体,因为我试图创建一个 NSAttributedString,它包含一些普通的 NSAttributedString,一个 HTML NSAttributedString,然后是更普通的 NSAttributedString。我不认为这应该是一个问题,也许这是一个错误???