You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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 Ventura下正常显示的HTML表格
  • macOS Sonoma中初始显示异常:
    macOS Sonoma下初始显示异常的HTML表格
  • 鼠标悬停时,原本损坏的内容才会正常显示:
    macOS Sonoma下鼠标悬停后正常显示的HTML表格

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后,又出现了新的布局问题:
强制使用TextKit 1后出现的新布局问题

内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:50:25