使用Swift在NSTextField中垂直对齐文本

时间:2015-12-20 08:54:12

标签: swift cocoa appkit

我一直在阅读有关如何在NSTextField上设置垂直对齐的各种选项。我希望文本显示在中心,并在Swift中以编程方式进行。以下是我到目前为止看到的内容:

我在Swift中尝试过的一件事是设置以下属性:

textField.usesSingleLineMode = true

有关垂直居中文字的最佳方式的任何提示都将非常感谢!

5 个答案:

答案 0 :(得分:6)

这很难做到,因为Apple非常难以做到这一点。我通过子类化NSTextFieldCell并使用ovRriding drawingRectForBounds:方法实现了它,如下所示:

override func drawingRectForBounds(theRect: NSRect) -> NSRect {
    let newRect = NSRect(x: 0, y: (theRect.size.height - 22) / 2, width: theRect.size.width, height: 22)
    return super.drawingRectForBounds(newRect)
}

这只是我的方式,我确定有更好的方法,我还不知道(还)。这仅适用于TextFields中的标准字体大小(文本高度为22)。这就是我硬编码的原因。 Haven还没弄明白,如果改变字体,如何在单元格中获得高度。

结果:

enter image description here

答案 1 :(得分:3)

在操场上试试这个,它将文本完美居中,在项目中使用它!希望它有所帮助!

import Cocoa

let cell = NSTableCellView()
cell.frame = NSRect(x: 0, y: 0, width: 100, height: 100)
let tf = NSTextField()
tf.frame = cell.frame
tf.stringValue = "MyTextfield"
tf.alignment = .Center

let stringHeight: CGFloat = tf.attributedStringValue.size().height
let frame = tf.frame
var titleRect:  NSRect = tf.cell!.titleRectForBounds(frame)

titleRect.size.height = stringHeight + ( stringHeight - (tf.font!.ascender + tf.font!.descender ) )
titleRect.origin.y = frame.size.height / 2  - tf.lastBaselineOffsetFromBottom - tf.font!.xHeight / 2
tf.frame = titleRect
cell.addSubview(tf)

答案 2 :(得分:1)

接受的答案非常有效,这是Swift3的版本。

class VerticallyAlignedTextFieldCell: NSTextFieldCell {
    override func drawingRect(forBounds rect: NSRect) -> NSRect {
        let newRect = NSRect(x: 0, y: (rect.size.height - 22) / 2, width: rect.size.width, height: 22)
        return super.drawingRect(forBounds: newRect)
    }
}

答案 3 :(得分:1)

我已经在NSView中添加了NSTextField并使其居中。

另一个解决方案是(在iOS项目中)创建UILabel并允许它调整其大小(sizeToFit())并再次将其嵌入到UIView中。

我个人不喜欢以前答案中的计算,iOS的第二个解决方案适用于所有文本大小和行号。

答案 4 :(得分:1)

我还面临着与NSTextField的垂直对齐问题。我的要求涉及在NSTextField中呈现单行字符串。另外, textfield需要调整大小意味着我们已经以编程方式调整了resize上text-field中文本的font-point-size。在这种情况下,我们面临垂直对齐问题 - 错误对齐很难直接掌握/理解。

最终有效:

所以,在我的场景中一个简单的,  关闭"单线模式"在界面构建器中
因为文本字段解决了这个问题。