当usesSingleLineMode为true时,NSTextField非系统字体内容被剪裁

时间:2016-03-23 13:05:20

标签: swift macos cocoa nstextfield

将非单一字体的usesSingleLineMode设置为true会导致剪切文本的顶部。

我创建了3个非常简单的测试用例来说明这一点:

  • good :非系统字体,其中usesSingleLineMode = false。工作正常。
  • bad :usesSingleLineMode = true的非系统字体。不起作用。
  • system :使用usesSingleLineMode = true的系统字体。工作正常。

将以下内容添加到新Cocoa OSX应用程序的viewDidLoad()方法中:

// Do any additional setup after loading the view.
let good = NSTextField(frame: NSRect(x: 0, y: 0, width: 800, height: 55))
good.usesSingleLineMode = false
good.font = NSFont(name: "HelveticaNeue-UltraLight", size: 24)
good.stringValue = "Good usesSingleLineMode false "
self.view.addSubview(good)

let bad = NSTextField(frame: NSRect(x: 0, y: 100, width: 800, height: 55))
bad.usesSingleLineMode = true
bad.font = NSFont(name: "HelveticaNeue-UltraLight", size: 24)
bad.stringValue = "Bad usesSingleLineMode true"
self.view.addSubview(bad)

let system = NSTextField(frame: NSRect(x: 0, y: 200, width: 800, height: 55))
system.usesSingleLineMode = true
system.font = NSFont.systemFontOfSize(24)
system.stringValue = "Good usesSingleLineMode true, System Font"
self.view.addSubview(system)

See the result

如果我在故事板中使用Interface Builder创建相同的bad NSTextField,请在IB中设置字体并选中IB中的使用单行模式,它可以正常工作!但是,在IB中构建整体视图是不切实际的,因此我想以编程方式创建它。

为什么会这样?我是否错过了一些重要设置(我尝试调整许多NSTextField和NSTextFieldCell参数无效?是否有解决方法?

2 个答案:

答案 0 :(得分:1)

根据Apple自己的说法,这是正确的,甚至是期望的行为:

  

Engineering已确定此问题的行为符合预期   关于以下信息:

     

根据NSCell的文档正确运行:

     

单线模式下的单元格使用固定基线布局。文本   无论如何,基线位置仅由控制尺寸决定   内容字体样式或大小。

来源:http://www.openradar.me/13813516

文档中说的内容确实正确,但这里的重要细节是文档没有说明的内容。它确实说" 文本基线位置仅由控件大小决定"但它没有详细解释如何做到这一点。并且已知的事实是,基线似乎总是正确地适合系统字体,但它几乎不适合您系统上的任何其他字体。问题在于,Apple会说" 固定基线布局",好像这就是众所周知的记录,但它不是。我还没有找到任何可以解释 固定基线布局的文档,甚至是遗留文档中的文档。

答案 1 :(得分:-1)

我有同样的问题,我通过设置解决了 usesSingleLineMode=false