2016-01-03 108 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

相關問題