我有一个UIView
,我在其中添加了UILongPressGestureRecognizer
,这样我就可以处理点击,并使UIView
像按钮一样工作。
let longPressGtr = UILongPressGestureRecognizer(target: self, action:#selector(longPressSelector))
longPressGtr.minimumPressDuration = 0.1
myView.isUserInteractionEnabled = true
myView.addGestureRecognizer(longPressGtr)
@objc func longPressSelector(_ gestureRecognizer: UILongPressGestureRecognizer) {
if gestureRecognizer.state == .began {
myView.backgroundColor = UIColor.gray
} else if gestureRecognizer.state == .ended {
myView.backgroundColor = UIColor.blue // my button is blue
doSomething()
}
}
func doSomething() {
print("view was pressed")
}
这是可行的,但有一点不可行,那就是当我按住UIView,但将手指从视图中拖出来时,"按钮"不会取消选择。它仍然发射doSomething()
。一个常规的UIButton
将取消选择该按钮,而不会启动它。如果你按住它并将手指从视图中拖出来,则单击。
如何在UIView
中实现此功能?
或者有没有更好的方法让UIView
像按钮一样发挥作用?
您需要检查手势是否在视图中。
@objc func longPresserDidFire(_ presser: UILongPressGestureRecognizer) {
let gestureIsInside = myView.point(inside: presser.location(in: myView), with: nil)
switch presser.state {
case .began, .changed:
if gestureIsInside {
myView.backgroundColor = .blue
} else {
myView.backgroundColor = .gray
}
case .cancelled:
myView.backgroundColor = .gray
case .ended:
myView.backgroundColor = .gray
if gestureIsInside {
doSomething()
}
default: break
}
}
您没有添加gestureRecognizer状态更改的条件,这就是它接受结束状态的原因。
@objc func longPressSelector(_ gestureRecognizer: UILongPressGestureRecognizer) {
if gestureRecognizer.state == .began {
} else if gestureRecognizer.state == .changed {
}else if gestureRecognizer.state == .ended {
}
}
再添加一个条件并检查它是否有效。
当您将手指拖动到视图之外时,gestureRecognizer
可能会转换为failed
或cancelled
状态,因此您需要添加对这种情况gestureRecognizer.state == .failed
和gestureRecognizer.state == .cancelled
的处理。
@objc func longPressSelector(_ gestureRecognizer: UILongPressGestureRecognizer) {
}
放置UILongPressGestureRecognizer而不是uiMapGestureIdentifier并检查其