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

Swift 当UseSingleLineMode为true时,NSTextField非系统字体内容被剪裁,swift,macos,cocoa,nstextfield,Swift,Macos,Cocoa,Nstextfield,将非系统字体的UseSingleLineMode设置为true会导致文本顶部被剪裁 我创建了3个非常简单的测试用例来说明这一点: 好:非系统字体,usesSingleLineMode=false。很好 错误:UseSingleLineMode=true的非系统字体。不起作用 system:UseSingelLineMode=true的系统字体。很好 将以下内容添加到新Cocoa OSX应用程序的viewDidLoad()方法中: // Do any additional setup afte

将非系统字体的UseSingleLineMode设置为true会导致文本顶部被剪裁

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

  • 好:非系统字体,usesSingleLineMode=false。很好
  • 错误:UseSingleLineMode=true的非系统字体。不起作用
  • system:UseSingelLineMode=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)

如果我在情节提要中使用Interface Builder创建了相同的
bad
NSTextField,请在IB中设置字体,并检查IB中是否使用单线模式,它工作正常!但是,在IB中构建整体视图是不切实际的,因此我希望以编程方式创建它


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

我通过将
UseSingelineMode
设置为
false

解决了这个问题。根据苹果自己的说法,这是正确的,甚至是期望的行为:

工程部已确定该问题的行为符合预期 关于下列信息:

根据NSCell的文档,此操作正确:

单行模式下的单元格使用固定基线布局 基线位置仅由控件大小决定,而不考虑 内容、字体、样式或大小

资料来源:


文档所说的确实是正确的,但这里重要的细节是文档没有说的。文档确实说“文本基线位置完全由控件大小决定”但它没有详细解释这是如何做到的。众所周知,基线似乎总是与系统字体正确匹配,但它几乎不适合系统上的任何其他字体。问题是苹果提到了“固定基线布局”,似乎这是一些已知的、有很好文档记录的东西,但事实并非如此。我还没有找到任何文档,即使是在遗留文档中,可以解释固定基线布局。

奇怪的是,我有一个带有自定义字体的按钮,但当我设置
UsesSingleLineMode=true
时,文本仍保持在正常位置。“单行模式下的单元格使用固定基线布局。文本基线位置完全由控件大小决定,而与内容字体样式或大小无关。”。“来源:Willeke,我确实忽略了这一点,所以我很感谢你指出这一点。但是,这显然不是全部。如果我用HelveticaNeue(与系统字体相同)替换HelveticaNeue UltraLight,文本仍然被剪裁。而如果我使用NSFont.systemFontOfSize(24)没有剪裁。而且,所有控件大小都是相同的,因此可以推断基线是相同的。我很想知道您是否尝试了各种字体以查看是否有任何效果。您是否在设置UseSingleLineMode之前尝试过设置字体?
UseSingleLineMode
默认情况下是
false
,但是“如何正确使用该模式?”不能是“不要使用它”“。OP是故意设置的,因为它也会触发你的文本视图不会有的特定行为,所以这根本不是一个答案,OP非常清楚问题不会以这种方式发生,他甚至发布了一个屏幕截图,准确地演示了这一点;因此,投了反对票。感谢链接到苹果的回复