NSAttributedString绘制位置在10.13和10.14+上有所不同

问题描述

我使用NSAttributedString的{​​{1}}将字符串绘制到视图中(普通draw(in: rect)也会出现同样的问题)。现在,结果似乎与我在Xcode中设置的部署目标不同。如果部署目标是Nsstring,则draw调用将这样呈现

enter image description here

其中红色框代表10.13。如果我在不触摸代码的情况下将部署目标切换到rect或更高版本,则相同的绘制调用将呈现为这样

enter image description here

创建一个空项目,将10.14内容视图类设置为NSWindow并在下面创建该类。

TestView

现在在10.13和10.14+部署目标之间切换,字符串位置将移动。如果您要检查字符串class TestView: NSView { override func draw(_ dirtyRect: NSRect) { NSAttributedString(string: "9",attributes: [ .font: NSFont.userFixedPitchFont(ofSize: 48)!,.foregroundColor: NSColor.labelColor ]).draw(in: bounds) } } ,它将在10.13上返回.size(),在10.14+上返回68

如何使平台之间保持一致?由于它位于包中,因此DT可能会有所不同,我想避免使用不同的代码路径。

此外,10.14 +版本似乎更“正确”。

解决方法

我尝试更改字体,并发现如果使用默认系统字体,该问题将消失。这使我相信问题出在固定间距字体上-取决于DT,它的行高似乎有所不同。

通过段落样式设置特定的行高可以解决该问题:

override func draw(_ dirtyRect: NSRect) {
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.minimumLineHeight = 58
    paragraphStyle.maximumLineHeight = 58
    NSAttributedString(string: "9",attributes: [
        .font: NSFont.userFixedPitchFont(ofSize: 48)!,.foregroundColor: NSColor.labelColor,.paragraphStyle: paragraphStyle
    ]).draw(in: bounds)
}
,

我从苹果那里得到的回复:

这是预期行为。部署到 macOS 10.14 或更高版本的应用程序将获得更新的排版行为,这会影响字形的间距和文本的行高。文本字段高度受文本度量的行高影响。

排版机行为的变化更正了一个长期存在的浮点舍入错误,该错误导致额外的高度被添加到默认上升器,因此文本的尺寸可能比以前小。

请参阅记录此更改的 macOS 10.14 AppKit 发行说明:https://developer.apple.com/documentation/macos-release-notes/appkit-release-notes-for-macos-10_14