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

Eri*_*ner 5 macos cocoa appkit swift

我使用NSAttributedStringsdraw(in: rect)将一个字符串绘制到一个视图中(普通的也会出现同样的问题NSString)。现在结果似乎与我在 Xcode 中设置的部署目标不同。如果部署目标是10.13,则绘制调用会像这样呈现它

在此处输入图片说明

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

在此处输入图片说明

创建一个空项目,将NSWindows内容视图类设置为TestView并创建下面的类。

class TestView: NSView {

    override func draw(_ dirtyRect: NSRect) {
        NSAttributedString(string: "9", attributes: [
            .font: NSFont.userFixedPitchFont(ofSize: 48)!,
            .foregroundColor: NSColor.labelColor
        ]).draw(in: bounds)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在在 10.13 和 10.14+ 部署目标之间切换,字符串位置将发生变化。如果您检查字符串,.size()它会68在 10.13 和5810.14+ 上返回。

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

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

小智 2

我尝试更改字体,发现如果您使用默认系统字体,问题就会消失。这让我相信问题在于固定间距字体 \xe2\x80\x94 它似乎有不同的行高,具体取决于 DT。

\n

通过段落样式设置特定的行高可以修复此问题:

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