2016-06-07 21 views
0

Ich habe versucht, eine mehrzeilige NSTextField automatisch mit preferredMaxLayoutWidth Layout zu erstellen. Ich kann nicht herausfinden, warum das nicht funktioniert.Mehrzeiliges NSTextField funktioniert nicht

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)") 
    } 
} 

Diese Drucke:

Intrinsic Inhalt Größe: (-1,0, 21,0)

passende Größe: (20,0, 21,0)

(21,0 ist die Größe für eine einzige Zeile.)

+0

Was nicht funktioniert? Es sieht so aus, als ob die Breite so eingestellt ist, dass nur ein Zeichen pro Zeile angezeigt wird. –

+0

@ l'L'Die Breite ist auf 20 Punkte beschränkt. Ich erwarte, dass "NSTextField" eine Höhe zurückgibt, die groß genug ist, um den gesamten Text aufzunehmen. – fumoboy007

+0

Warum also nicht auch eine Beschränkung für 'heightAnchor' verwenden? –

Antwort

0

OK. So stellt sich heraus, dass, wenn sich ein NSTextField im Bearbeitungsmodus befindet, ein geheimer NSTextView (auch bekannt als "Feldeditor") für den Bearbeitungsteil übernimmt. Textänderungen werden erst wieder mit dem Textfeld synchronisiert, wenn die Bearbeitung beendet ist. Dies erklärt, warum mein Beispielcode nur im Nichtbearbeitungsmodus funktioniert.

Sie können die Synchronisierung erzwingen, indem Sie auf die Eigenschaft NSTextField.stringValue zugreifen. Dies ist, was ich in einer NSTextField Unterklasse getan habe. Ich habe auch meine eigene Implementierung von intrinsicContentSize zur Verfügung gestellt, da Apples Implementierung nicht im Bearbeitungsmodus funktioniert und im Nicht-Bearbeitungsmodus fehlerhaft ist.

0

Es gibt eine andere Lösung, um das NSTextField multiline mit der Verwendung von automatischen Einschränkungen und Interface Builder zu machen.

  • wählen Wraps von Layout-
  • Character Wrap Wählen Sie aus Zeilenumbruch Option
  • Verwendet Einzeilenmodeunchecked

sein muss und unter Probenbedingungen hinzufügen

  • nachstehendes Leerzeichen
  • Führende Raum
  • Bodenraum
  • Top Raum

mit den Konstanten, die Sie wollen. Fügen Sie keine spezifische Höhenbeschränkung hinzu.

Im Folgenden einige Screenshots, die hilfreich sein könnten.

Constraints

NSTextField Settings