swift – NSTextField上的奇怪滚动
|
我有一个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(
"nn>>>>>> text field resized " +
"nnaturalSize=(naturalSize)" +
"noriginalFrame=(originalFrame)-(originalFrame.center)" +
"nnewFrame=(textField.frame)-(textField.frame.center)"
)
}
}
这是在NSTextFieldDelegate方法中调用的: 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
}()
完整代码:https://github.com/fespinoza/linked-ideas-osx
问题的一部分是您直接调用becomeFirstResponder方法.你不应该这样做
根据documentation:
此外,您是否真的需要textfield才能在水平和垂直方面发展?以高度为单位动态化显然会更加直观. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
