为什么我的手势识别器在我以编程方式创建时不起作用?

飞狐

我从要以编程方式创建的故事板翻译了一些代码。那么当我以编程方式创建手势识别器时,为什么我的手势识别器没有被调用?

还有其他关于确保在视图上启用的SO 帖子UIView.isUserInteractionEnabled,这不是问题。我也试过设置 UIGestureRecognizerDelegate: 在gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:)我看到我的手势触发并且总是返回 true 没有帮助。是的,我正在安装手势识别器UIView.addGestureRecognizer(_:)

class ExampleView: UIView {
  let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(myAction(_:)))

  required init?(coder: NSCoder) {
    super.init(coder: coder)
    commonInit()
  }

  override init(frame: CGRect) {
    super.init(frame: frame)
    commonInit()
  }

  @objc func myAction(_ sender: UITapGestureRecognizer) {
    print("never happens")
  }

  private func commonInit() {
    isUserInteractionEnabled = true
    tapGestureRecognizer.delegate = self
    addGestureRecognizer(tapGestureRecognizer)
  }
}

extension ExampleView: UIGestureRecognizerDelegate {
  func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
  }
}
飞狐

看起来您无法在 self 尚不可用的类的初始化时创建引用 self 的目标操作。我不确定为什么没有警告或错误。

有两种可能的解决方法:

  1. 尽管UIGestureRecognizer文档中没有它,但有一个没有参数的 vanilla init 方法。使用它,然后UIGestureRecognizer.addTarget(_:action:)在初始化后的某个时间调用

  2. 使用惰性属性

private lazy var tapGestureRecognizer: UITapGestureRecognizer = { .init(target: self, action: #selector(myAction)) }()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章