2016-01-03 43 views
0

如果我拖动Label(的NSTextField类)一个到在界面生成器的视图,并且然后尝试设置其stringValue动态像这样:的NSTextField标签:动态地改变的内容和增长宽度以适应

self.testingLabel.stringValue = "Labels are really really really long" 

然后大部分标签将被切断。

cut off text

我怎样才能使标签成长,以适应不包装/滚动它的内容?

我试过使用这个自定义类,但它不起作用。

class AutogrowTextField: NSTextField { 
    override var intrinsicContentSize: NSSize { 
     get { 
      var frame = self.frame; 
      frame.size.width = CGFloat.max; 

      // Calculate new height within the frame 
      // with practically infinite height. 
      let width = self.cell!.cellSizeForBounds(frame).width 

      Swift.print(width) 
      NSBeep() 

      Swift.print(self.frame.width) 

      return NSMakeSize(width, frame.size.height) 
     } 
    } 

    // you need to invalidate the layout on text change, else it wouldn't grow by changing the text 
    override func textDidChange(notification: NSNotification) { 
     super.textDidChange(notification) 
     self.invalidateIntrinsicContentSize() 
    } 
} 

基本上我只想一个HTML文档的这样的默认行为:

<p id="dynamic">Hi</p> 

<script> 
    document.getElementByID("dynamic").innerHtml = "Something really really really long" 
</script> 

因为虽然我是新来的Mac OS X和可可这对我来说是非常痛苦的,我不是'初学者'程序员。

在这里有帮助的是属性检查器的内容。 (这应该只是所有默认值)

attributes

是的,自动布局启用

enabled

回答

0

你确定你的NIB或故事板被配置为使用自动布局?这将是文件检查器上的复选框。

我问的原因是,属性检查器将在“使用单线模式”复选框的下方有一个“首选宽度_第一运行时布局宽度”复选框。它没有,这让我觉得自动布局没有启用。

如果您未使用自动布局,那么您需要负责设置标签的框架大小,或者更简单地说,通过致电sizeToFit()告诉它调整其大小以适应其内容。

如果您使用的是自动布局,那么标准NSTextField已根据其字符串内容计算其intrinsicContentSize。这个问题几乎可以肯定,你可能在视图上设置了其他任何限制。您需要确保自动布局系统可以自由调整标签的宽度。所以,你不能设置明确的宽度约束。或者,如果您有一个前导和尾随间隔约束,则需要确保标签的压缩阻力优先级足够高,以便将其他相关视图推出或压缩它们。等

+0

是自动布局已启用,我没有添加任何约束。你确定它会默认增长吗?我认为这是默认情况下剪裁/包装/粘贴到原始大小。我并没有想象这会让它变得越来越难。 – neon64

+0

您使用的是哪种版本的Xcode?另外,尝试为超级视图(而不是其他人)添加约束条件,例如,超前视图和顶部间距。您也可以尝试将标签的“布局”属性设置为截断并启用“使用单线模式”。 –

+0

啊哈!所以我认为默认情况下,自动布局假定'没有约束'真的意味着'固定位置/所有东西都受到约束',所以只需要添加顶部和左侧/前导约束,迫使引擎使底部/右侧约束更加灵活?我必须承认我之前还没有处理过自动布局,因此阅读它可能会有所帮助:P – neon64

相关问题