Swift 4
Champ NSTextField éditable et à dimensionnement automatique
Basé sur le post Objective-C de Peter Lapisu
Sous-classe NSTextField
ajoutez le code ci-dessous.
override var intrinsicContentSize: NSSize {
// Guard the cell exists and wraps
guard let cell = self.cell, cell.wraps else {return super.intrinsicContentSize}
// Use intrinsic width to jive with autolayout
let width = super.intrinsicContentSize.width
// Set the frame height to a reasonable number
self.frame.size.height = 750.0
// Calcuate height
let height = cell.cellSize(forBounds: self.frame).height
return NSMakeSize(width, height);
}
override func textDidChange(_ notification: Notification) {
super.textDidChange(notification)
super.invalidateIntrinsicContentSize()
}
Réglage de self.frame.size.height
à "un nombre raisonnable". évite quelques bogues lors de l'utilisation de FLT_MAX
, CGFloat.greatestFiniteMagnitude
ou de grands nombres. Les bogues se produisent pendant le fonctionnement lorsque l'utilisateur sélectionne le texte dans le champ, il peut faire défiler le texte vers le haut et vers le bas à l'infini. De plus, lorsque l'utilisateur saisit du texte, le NSTextField
est masqué jusqu'à ce que l'utilisateur termine l'édition. Enfin, si l'utilisateur a sélectionné l'option NSTextField
et tente ensuite de redimensionner la fenêtre, si la valeur du paramètre self.frame.size.height
est trop grande, la fenêtre sera suspendue.