更改 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 1
和Item 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
以正确的字体和正确的样式打印出 item1
和 item2
(换行的单词与项目符号点的 minx 值不同)
我认为 HTML 部分出现了不正确的字体,因为我试图创建一个 NSAttributedString,它包含一些普通的 NSAttributedString,一个 HTML NSAttributedString,然后是更普通的 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 1
和Item 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
以正确的字体和正确的样式打印出 item1
和 item2
(换行的单词与项目符号点的 minx 值不同)
我认为 HTML 部分出现了不正确的字体,因为我试图创建一个 NSAttributedString,它包含一些普通的 NSAttributedString,一个 HTML NSAttributedString,然后是更普通的 NSAttributedString。我不认为这应该是一个问题,也许这是一个错误???