为什么NSAttributedString.size()
和NSLayoutManager.boundingRect(forGlyphRange:in:).size
的结果如此不同?
示例代码:
let attrs: [NSAttributedString.Key: Any] = [.font: NSFont.systemFont(ofSize: 14.0)]
let container = NSTextContainer()
container.lineFragmentPadding = 0.0
container.lineBreakMode = .byClipping
container.containerSize = NSSize(width: 5e6, height: 5e6)
let layoutManager = NSLayoutManager()
layoutManager.addTextContainer(container)
let text = NSTextStorage()
text.addLayoutManager(layoutManager)
text.setAttributedString(NSAttributedString(string: "Hello, world!", attributes: attrs))
var range = NSMakeRange(0, text.length)
print(text.size())
print(layoutManager.boundingRect(forGlyphRange: range, in: container).size)
text.setAttributedString(NSAttributedString(string: "東京", attributes: attrs))
range = NSMakeRange(0, text.length)
print(text.size())
print(layoutManager.boundingRect(forGlyphRange: range, in: container).size)
这是我得到的结果:
(80.3837890625, 18.0)
(80.3837890625, 17.0)
(25.85410895660203, 14.0)
(25.85410895660203, 19.463557481765747)
如您所见,尽管宽度相同,但高度却不同。在第一种情况下,NSLayoutManager
的高度小于NSAttributedString
,在第二种情况下,高度较大。
造成这种差异的原因是什么?
我已经阅读了这两种方法的文档。我还阅读了Apple档案中的“文本系统存储层概述”。我在那里找不到信息。