为什么我的手势识别器在我以编程方式创建时不工作?
Why isn't my gesture recognizer working when I programmatically create it?
我翻译了故事板中的一些代码,以便以编程方式创建。那么,当我以编程方式创建手势识别器时,为什么我的手势识别器没有被调用?
关于确保在视图上启用 UIView.isUserInteractionEnabled
还有其他 SO posts,这不是问题所在。我也试过设置 UIGestureRecognizerDelegate: In 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
}
}
您似乎无法在 class 的初始化时创建引用 self 的目标操作,其中 self 尚不可用。我不确定为什么没有警告或错误。
有两种可能的解决方法:
虽然 UIGestureRecognizer 文档中没有它,但有一个没有参数的普通 init 方法。使用它,然后在初始化后的某个时间调用 UIGestureRecognizer.addTarget(_:action:)
。
使用懒惰属性
private lazy var tapGestureRecognizer: UITapGestureRecognizer = { .init(target: self, action: #selector(myAction)) }()
我翻译了故事板中的一些代码,以便以编程方式创建。那么,当我以编程方式创建手势识别器时,为什么我的手势识别器没有被调用?
关于确保在视图上启用 UIView.isUserInteractionEnabled
还有其他 SO posts,这不是问题所在。我也试过设置 UIGestureRecognizerDelegate: In 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
}
}
您似乎无法在 class 的初始化时创建引用 self 的目标操作,其中 self 尚不可用。我不确定为什么没有警告或错误。
有两种可能的解决方法:
虽然 UIGestureRecognizer 文档中没有它,但有一个没有参数的普通 init 方法。使用它,然后在初始化后的某个时间调用
UIGestureRecognizer.addTarget(_:action:)
。使用懒惰属性
private lazy var tapGestureRecognizer: UITapGestureRecognizer = { .init(target: self, action: #selector(myAction)) }()