取消选择 UIView "button"时将手指拖离它



我有一个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可能会转换为failedcancelled状态,因此您需要添加对这种情况gestureRecognizer.state == .failedgestureRecognizer.state == .cancelled的处理。

@objc func longPressSelector(_ gestureRecognizer: UILongPressGestureRecognizer) {
}

放置UILongPressGestureRecognizer而不是uiMapGestureIdentifier并检查其

最新更新