加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift – NSTextField上的奇怪滚动

发布时间:2020-12-14 05:34:14 所属栏目:百科 来源:网络整理
导读:我有一个NSTextField,我尝试自动调整大小,一旦它的内容改变一定的标准. 有时,当开始输入内容时,开始向上(或向下)文本字段的可见部分,如以下gif所示: 如果我点击NSTextField内部,内容再次出现在正确的位置. 在XCode中启动可视化调试器我发现当这种情况发生时
我有一个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:

Use the NSWindow makeFirstResponder(_:) method,not this method,to
make an object the first responder. Never invoke this method directly.

此外,您是否真的需要textfield才能在水平和垂直方面发展?以高度为单位动态化显然会更加直观.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读