【问题标题】:NSAttributedString draw location different on 10.13 and 10.14+NSAttributedString 在 10.13 和 10.14+ 上绘制位置不同
【发布时间】:2020-10-06 20:51:10
【问题描述】:

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

红色框代表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)
    }
}

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

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

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

【问题讨论】:

  • 我也遇到了同样的问题,最后是怎么解决的?
  • 采用了一些次优的硬编码解决方案,但这并不重要,因为我只是将我的部署目标提高到 10.14。

标签: swift macos cocoa appkit


【解决方案1】:

我尝试更改字体并注意到如果您使用默认系统字体,问题就会消失。这让我相信问题出在固定间距字体上——它似乎有不同的行高,具体取决于 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)
}

【讨论】:

    【解决方案2】:

    我从 Apple 得到的回复:

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

    排版行为更改纠正了长期存在的浮点舍入错误,该错误导致额外高度被添加到默认升序,因此文本可能比以前更小。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-29
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 2017-07-01
      • 1970-01-01
      相关资源
      最近更新 更多