如何修复macOS Sonoma中NSTextView的HTML布局问题?
macOS Sonoma下NSTextView加载HTML表格的布局问题
在macOS Sonoma(23A5312d)系统中,使用NSTextView加载包含HTML表格的NSAttributedString时,会出现布局异常问题。
复现代码
override func viewDidLoad() { super.viewDidLoad() let html = """ <table width="100%" border="1" style="color: white"> <tr> <td align="left">Left</td> <td align="right">Right</td> </tr> </table> """ let data = Data(html.utf8) let definition = try! NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: NSNumber(value: String.Encoding.utf8.rawValue)], documentAttributes: nil) let frameRect = NSRect(x: 100, y: 0, width: 300, height: 200) let textView = NSTextView(frame: frameRect) textView.textStorage?.setAttributedString(definition) textView.backgroundColor = .clear view.addSubview(textView) }
显示效果对比
- macOS Ventura中显示正常:

- macOS Sonoma中初始显示异常:

- 鼠标悬停时,原本损坏的内容才会正常显示:

Apple反馈与临时解决方案
该问题已通过反馈编号FB12800496提交给Apple,Apple回复称问题原因是「处理表格内容时降级到TextKit 1」,并推荐通过init(usingTextLayoutManager:)创建基于TextKit 1的NSTextView,修改后的代码可解决HTML内容初始不显示的问题:
let textView = NSTextView(usingTextLayoutManager: false) textView.frame = frameRect
Apple同时指出,布局问题源于WebKit的NSAttributedString转换流程,而TextKit内部的WebKit1转换器可正确处理该场景,请问是否可以直接调用WebKit1转换器?
2023-11-01 更新
按照WWDC2022视频《TextKit与文本视图新特性》(编号10090,625秒处)中「以编程方式退出TextKit 2」的说明,强制使用TextKit 1后,又出现了新的布局问题:
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

