【问题标题】:How to resize NSTextField when content increase in NSTextField当 NSTextField 中的内容增加时如何调整 NSTextField 的大小
【发布时间】:2012-11-03 17:56:28
【问题描述】:

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

【问题讨论】:

  • 这个问题已经被问过很多次了......所以在发布之前 - 先做一些搜索和研究。
  • yes anoop,有很多解决方案,但都是通过代码完成的。在我的问题中,我问过界面生成器中是否有任何设置,而不是通过代码计算和设置。
  • 您在任何地方都没有提到 IB !!!在 IB 它不存在。
  • 我让你进行搜索和研究,因为如果有人投票给你,你的分数可能会被削减。
  • @AnoopVaidya 之前被问过很多次,因为它非常困难,而且没有人(据我所知)提供过答案。我做了 15 年的可可开发人员,经过 3 个小时试图让它工作后,我放弃了,将使用 NSTextView 而不是 NSTextField - 在编辑时调整大小时似乎有问题

标签: cocoa nstextfield nstextview


【解决方案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)
}

【讨论】:

    【解决方案2】:

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

    但是,您可以通过代码进行: 您可以在实现的 NSTextField 上设置委托

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

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

    还有这个。

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

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

    2016 年 3 月编辑

    现在,Mac OS 应用程序具有自动布局功能,有助于增加和减小文本字段甚至 NSWindow 的大小,因此您可以非常轻松地使用它们。只需从窗口的任一侧放置约束,并将约束设置为 ( >= desiredMinimumSize ) 即可!

    【讨论】:

    • 在编辑文本字段时调整其大小无法正常工作,这似乎使该字段处于无法正确绘制自身的损坏状态。使文本字段变小几乎可以工作,但增加大小会完全破坏它。
    • @AbhiBeckert:现在即使使用 IB,您也可以使用 Autolayout 实现这一目标。我更新了答案。
    • 你试过了吗?我无法让它与测试项目一起工作。你确定你明白这个问题吗?这个想法是增加字段的宽度以适应用户输入的任何内容。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      • 2012-08-18
      • 1970-01-01
      相关资源
      最近更新 更多