Несоответствие при расчете геометрического размера струны

Почему результаты 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. Я не смог найти там информацию.


person mistercake    schedule 13.02.2019    source источник
comment
Дубликат NSAttributedStringboundingRect возвращает неправильную высоту   -  person Willeke    schedule 14.02.2019