我从要以编程方式创建的故事板翻译了一些代码。那么当我以编程方式创建手势识别器时,为什么我的手势识别器没有被调用?
还有其他关于确保在视图上启用的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 的目标操作。我不确定为什么没有警告或错误。
有两种可能的解决方法:
尽管UIGestureRecognizer文档中没有它,但有一个没有参数的 vanilla init 方法。使用它,然后UIGestureRecognizer.addTarget(_:action:)
在初始化后的某个时间调用。
使用惰性属性
private lazy var tapGestureRecognizer: UITapGestureRecognizer = { .init(target: self, action: #selector(myAction)) }()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句