3

我有 NSTextField 但我必须显示的内容不是固定的,它会动态增长。有什么简单的方法可以让我们动态改变大小。提前致谢 :)

4

3 回答 3

1

文本字段的委托需要随着文本的变化而更新大小。

诀窍是您必须手动更新stringValue属性,以避免错误:

override func controlTextDidChange(obj: NSNotification) {
  guard let field = obj.object as? NSTextField else {
    return
  }

  // re-apply the string value, this is necessary for the text field to correctly calculate it's width
  field.stringValue = field.stringValue

  // calculate the new dimensions
  let maxWidth: CGFloat = 500
  let maxHeight: CGFloat = 50
  let size = renameField.sizeThatFits(NSSize(width: maxWidth, height: maxHeight))

  // apply them
  field.frame = NSRect(x: field.frame.origin.x, y: field.frame.origin.y, width: size.width, height: size.height)
}
于 2016-03-29T08:30:00.433 回答
0

没有通过 Interface Builder 设置的选项。

但是你可以通过代码来做:你可以在实现的 NSTextField 上设置一个委托

- (void)controlTextDidChange:(NSNotification *)aNotification;

每次调用委托时,根据您上面的想法调整控件的大小。

还有,这个。

Jerry Krinock 的 NSString/NSAttributedString 上有一个很棒的类别,它允许您根据文本的宽度计算文本的高度,反之亦然:

http://www.sheepsystems.com/sourceCode/sourceStringGeometrics.html

2016 年 3 月编辑

现在,由于 Mac OS 应用程序的 Autolayout 功能有助于增加和减小文本字段甚至 NSWindow 的大小,因此您可以非常容易地使用它们。只需从窗口的任一侧放置约束,并将约束设置为 ( >= desiredMinimumSize ),就完成了!

于 2012-11-15T06:23:23.987 回答
0

如果您只是显示内容,而不是在文本字段中输入,那么您应该使用一个标签,该标签可以在 IB 中设置为“Size To Fit Content”。这将导致标签足够大以容纳内容。

于 2012-11-16T23:21:48.437 回答