计算琴弦几何尺寸时的差异

时间:2019-02-13 18:22:21

标签: swift appkit textkit

为什么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档案中的“文本系统存储层概述”。我在那里找不到信息。

0 个答案:

没有答案