在开发中,我们经常会遇到多个视图在交互上要求响应同样的手势,比如TableView上的cell控件,如果这个手势是长按手势,那么用户在交互的时候,会出现两个手指同时长时间长按不同cell的交互,在这种情况下,我们理想是需要两个手势中先到达需求的手势触发事件,而其他手势不触发。今天记录一下这种处理方法,思路是利用手势的代理方法来阻断/传递手势的触发。
未处理之前:
view1 = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
view1!.backgroundColor = UIColor.redColor()
view.addSubview(view1!)
view2 = UIView(frame: CGRect(x: 100, y: 250, width: 100, height: 100))
view2!.backgroundColor = UIColor.greenColor()
view.addSubview(view2!)
longPressGR1 = UILongPressGestureRecognizer(target: self, action: "longPressGR1Action:")
view1!.addGestureRecognizer(longPressGR1!)
longPressGR2 = UILongPressGestureRecognizer(target: self, action: "longPressGR2Action:")
view2!.addGestureRecognizer(longPressGR2!)
手势事件:
func longPressGR1Action(gestureRecognizer: UILongPressGestureRecognizer) -> Void {
print("longPressGR1")
}
func longPressGR2Action(gestureRecognizer: UILongPressGestureRecognizer) -> Void {
print("longPressGR2")
}
在两个手指长按两个视图的时候,事件如下:
接下来设置手势的代理:
longPressGR1!.delegate = self
longPressGR2!.delegate = self
然后设置一个标志,用来标识当前手势能否能被触发:
var isResponse = false
实现手势是否允许被执行的代理方法:
func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
if isResponse {
return false
} else {
isResponse = true
return true
}
}
最后修改手势事件方法,在方法中根据手势状态进行事件执行或标识修改:
func longPressGR1Action(gestureRecognizer: UILongPressGestureRecognizer) -> Void {
if gestureRecognizer.state == UIGestureRecognizerState.Began {
print("longPressGR1")
} else {
isResponse = false
}
}
func longPressGR2Action(gestureRecognizer: UILongPressGestureRecognizer) -> Void {
if gestureRecognizer.state == UIGestureRecognizerState.Began {
print("longPressGR2")
} else {
isResponse = false
}
}
之后同样的交互,一次只能触发一个手势,如下: