我有一个NSTextField,我尝试自动调整大小,一旦它的内容改变一定的标准.
有时,当开始输入内容时,开始向上(或向下)文本字段的可见部分,如以下gif所示:
如果我点击NSTextField内部,内容再次出现在正确的位置.
在XCode中启动可视化调试器我发现当这种情况发生时,NSTextField:_NSKeyboardFocusClipView的私有子视图具有一个Y坐标为负数的帧.
我不知道是什么原因.
这是我的textField调整大小的行为:
import Cocoa struct TextFieldResizingBehavior { let maxHeight: CGFloat = 100000.0 let maxWidthPadding: CGFloat = 10 let minWidth: CGFloat = 50 let maxWidth: CGFloat = 250 func resize(_ textField: NSTextField) { let originalFrame = textField.frame var textMaxWidth = textField.attributedStringValue.size().width textMaxWidth = textMaxWidth > maxWidth ? maxWidth : textMaxWidth textMaxWidth += maxWidthPadding var constraintBounds: NSRect = textField.frame constraintBounds.size.width = textMaxWidth constraintBounds.size.height = maxHeight var naturalSize = textField.cell!.cellSize(forBounds: constraintBounds) // ensure minimun size of text field naturalSize.width = naturalSize.width < minWidth ? minWidth : naturalSize.width if originalFrame.height != naturalSize.height { // correct the origin in order the textField to grow down. let yOffset: CGFloat = naturalSize.height - originalFrame.height let newOrigin = NSPoint( x: originalFrame.origin.x,y: originalFrame.origin.y - yOffset ) textField.setFrameOrigin(newOrigin) } textField.setFrameSize(naturalSize) Swift.print( "\n\n>>>>>> text field resized " + "\nnaturalSize=\(naturalSize)" + "\noriginalFrame=\(originalFrame)-\(originalFrame.center)" + "\nnewFrame=\(textField.frame)-\(textField.frame.center)" ) } }
extension CanvasViewController: NSTextFieldDelegate { override func controlTextDidChange(_ obj: Notification) { if let textField = obj.object as? NSTextField { textFieldResizingBehavior.resize(textField) } }
最后我的textfield在viewController中声明如下:
lazy var textField: NSTextField = { let textField = NSTextField() textField.isHidden = true textField.isEditable = false textField.allowsEditingTextAttributes = true return textField }()