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

问题描述 投票:8回答:5

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

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

textField.usesSingleLineMode = true

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

swift cocoa appkit
5个回答
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)。这就是我硬编码的原因。还没想到,如果更改字体,如何获得单元格中的高度。

结果:

enter image description here


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)

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)
    }
}

1
投票

我在NSView中添加了NSTextField并将其居中。

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

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


1
投票

我还面临着与NSTextField的垂直对齐问题。我的要求涉及在NSTextField中呈现单行字符串。此外,文本字段需要调整大小意味着我们在调整大小时以编程方式调整了文本字段内文本的字体大小。在这种情况下,我们面临垂直对齐问题 - 错误对齐很难直接掌握/理解。

终于有效了:

因此,在我的场景中,简单地关闭界面构建器中的“单线模式” 对于文本字段解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.