手势和UI控件之间冲突的解决方法(比如UITapGesture和UIButton冲突,UIPanGesture和UISlider冲突)

经过实验发现iOS5和iOS6里面,轻点手势和按钮的点击冲突机制是不同的,结果如下:
一个UIView上如果添加了一个按钮,又添加了Tap手势

在iOS5的设备上跑会只响应Tap手势,按钮不响应点击事件,只会有higlighted效果
在iOS5的设备上跑,按住了按钮,当过了3,4秒左右,跳过Tap手势的识别,再松手,按钮会响应
在iOS6的设备上跑,两者不会冲突,按钮可以点击,非按钮区域可以Tap手势

结论就是iOS5和6之间对于事件响应关系是有区别对待的,而且tap响应时间过后,系统会开始判断点击按钮,把刚才的长按理解为长期的touch down状态。这样处理我感觉很奇怪,万全之策还是要解决冲突,因为首先响应Tap事件,所以处理Tap事件的代理方法,过滤掉UIButton的影响。

具体实现,首先添加UIGestureRecognizerDelegate协议,然后把 Tap手势识别对象设置代理self,然后实现如下代码:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {

if ([touch.view isKindOfClass:[UIButton class]]){

return NO;

}

return YES;

}

同理,其他的input事件也可以通过下面的代码实现:


-
(BOOL)gestureRecognizer:(UIGestureRecognizer
 *)gestureRecognizer
shouldReceiveTouch:(UITouch
 *)touch
{


        if
([touch.view
isKindOfClass:[UIControl
class]])
{

            //we touched a button, slider, or other UIControl

            return NO;
 //ignore the touch
        }

    return YES;
//handle the touch

}

比如UISlider:

-(BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldReceiveTouch:(UITouch*)touch {

if([touch.view isKindOfClass:[UISlider class]])

{

    return NO;

}else{

    return YES;

    }

}

再次重申,iOS6没这个问题了

与TableView的冲突(iOS 9.0)

UIView 添加tap手势后 添加控件 UITableView 也会出现tableView不能点击的事件
解决办法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {

    if ([touch.view isKindOfClass:[tableView class]]) {
        return YES;
    }else {
        return NO;
    }
}


你可能感兴趣的:(手势和UI控件之间冲突的解决方法(比如UITapGesture和UIButton冲突,UIPanGesture和UISlider冲突))