2015-09-29 169 views
1

我的NSTextField與左,右和頂部約束定義(無底約束集)。如果內容不適合它,我需要增加NSTextField,如果還有未使用的空間,則需要減小大小。的NSTextField調整大小以適應內容

現在我有:用的NSTextField奇怪的行爲會自動擴展,如果它具有多行文字或內容太多,也的NSTextField不會對窗口大小調整降低自己的規模。

我還沒有發現寫在斯威夫特來解決這個問題(我有很多這樣的標籤與約束),在iOS的一切都與普通的文本標籤和制約工作的任何簡單的解決辦法。

Illustration

我創建了這個問題簡單的項目,你可以看到這個問題:[Download Text.zip]

我發現,但不能使用的解決方案:

  1. 你可以嘗試計算可能的TextField高度併爲其設置高度限制。該解決方案的問題:

    • 可能的高度計算不準確,有時您計算不正確的高度。
    • 解決方案使用一些複雜的代碼寫在Objective-C上。
  2. 在每個窗口上運行.sizeToFit()調整大小或文本更改操作。它不工作,因爲.sizeToFit()總是將所有文本壓縮到單行。

  3. 使用NSTextView代替的NSTextField。這是好方法,但:

    • 我不需要滾動,編輯和NSTextView的其他功能。我不想打電話給簡單標籤的複雜組件。
    • NSTextView總是要高度或底部的約束,我不知道底部約束,因爲內容可以用新的文本向下展開。
    • 我還沒有找到完整的解決方案,使NSTextView的行爲像我想:)
+0

禁用第一個運行時佈局的寬度和與此TextField玩。needsLayout = true textField.needsUpdateConstraints = true textField.needsDisplay = true。我不知道如何強制更新NSWindow實時調整大小的視圖。所以一旦你調用addText,視圖不會展開。但它會正確重繪窗口大小。 –

+0

@ xhruso00,如果我禁用第一運行時佈局NSTextField始終顯示爲1行。 needsLayout,needsUpdateConstraints,needsDisplay根本沒有效果(在我的測試中)。 – Vasily

+0

點擊按鈕後你調整了窗口大小嗎?只有這樣視圖纔會刷新。如果你解決了重繪問題,它會像你想要的那樣運行,幾乎沒有代碼。 –

回答

3

根據Mac OS X Release Notes(節的NSTextField intrinsicContentSize改進)它被稱爲時的NSTextField的高度改變的bug,但寬度保持不變。我們有兩種方法來修復它:

  1. 我們可以指定maximumNumberOfLines爲有意義的值。這對我們來說並不好,因爲我們不知道實際的行數,也不想計算它。
  2. 我們可以設置preferredMaxLayoutWidth到一個真正的價值。我曾與這樣的代碼結束:

代碼:

override func viewDidLayout() { 
    super.viewDidLayout() 
    textField.preferredMaxLayoutWidth = textField.frame.width 
} 
+0

你能看看我的問題嗎?我無法獲得'preferredMaxLayoutWidth'的工作。 http://stackoverflow.com/questions/37691202/nstextfield-preferredmaxlayoutwidth-not-working – fumoboy007

相關問題