2016-06-07 61 views
0

我一直在嘗試使用preferredMaxLayoutWidth自動佈局多行NSTextField。我無法弄清楚爲什麼這不起作用。多行NSTextField不工作

class ViewController: NSViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     let textField = NSTextField() 
     textField.cell!.usesSingleLineMode = false 
     textField.cell!.wraps = true 
     textField.cell!.lineBreakMode = .byCharWrapping 
     view.addSubview(textField) 

     textField.translatesAutoresizingMaskIntoConstraints = false 
     NSLayoutConstraint.activate([ 
     textField.topAnchor.constraintEqual(to: view.topAnchor), 
     textField.leadingAnchor.constraintEqual(to: view.leadingAnchor), 
     textField.widthAnchor.constraintEqual(toConstant: 20) 
     ]) 
     textField.preferredMaxLayoutWidth = 20 
     textField.stringValue = "abcdefghijklmnopqrstuvwxyz" 

     view.needsLayout = true 
     view.layoutSubtreeIfNeeded() 
     print("Intrinsic content size: \(textField.intrinsicContentSize)") 
     print("Fitting size: \(textField.fittingSize)") 
    } 
} 

此打印:

內在內容大小:(-1.0,21.0)

接頭尺寸:(20.0,21.0)

(21.0是大小單行)。

+0

什麼是不工作?看起來你已經將寬度設置爲每行只顯示一個字符。 –

+0

@ l'l l寬度限制爲20點。我期望'NSTextField'返回一個足夠大的高度來容納所有文本。 – fumoboy007

+0

那麼爲什麼不爲'heightAnchor'使用約束呢? –

回答

0

好的。所以事實證明,當NSTextField處於編輯模式時,祕密NSTextView(又名「字段編輯器」)接管編輯部分。直到編輯結束,文本更改纔會同步迴文本字段。這就解釋了爲什麼我的示例代碼只能在非編輯模式下工作。

您可以通過訪問NSTextField.stringValue屬性強制進行同步。這是我在NSTextField子類中所做的。我還提供了我自己的intrinsicContentSize的實現,因爲Apple的實現在編輯模式下不起作用,並且在非編輯模式下有問題。

0

還有另一種解決方案使用自動約束和Interface Builder來製作多行的NSTextField

  • 佈局
  • 選擇Wraps換行選項來選擇Character Wrap
  • 用途單線模式必須unchecked

並添加下面的示例約束

  • 尾隨空格
  • 前導空格
  • 底部空間
  • 頂層空間

與所需的常量。並且不要添加任何特定的高度限制。

下面的截圖可能會有幫助。

Constraints

NSTextField Settings