手势和UI控件之间冲突的解决方法(比如UITapGesture和UIButton冲突,UIPanGesture和UISlider冲突)
2014-07-22 09:47
946 查看
手势和UI控件之间冲突的解决方法(比如UITapGesture和UIButton冲突,UIPanGesture和UISlider冲突)
作者 xiaoyao
Li 在 12
十二月 2012, 5:03 下午
经过实验发现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事件也可以通过下面的代码实现:
比如UISlider:
-(BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldReceiveTouch:(UITouch*)touch {
if([touch.view isKindOfClass:[UISlider class]])
{
return NO;
}else{
return YES;
}
}
再次重申,iOS6没这个问题了
补充:ios6在模拟器上也是没有问题的,但在真机上就冲突了(UITapGesture和UIButton)
作者 xiaoyao
Li 在 12
十二月 2012, 5:03 下午
经过实验发现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事件也可以通过下面的代码实现:
1 2 3 4 5 6 7 8 | - (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 } |
-(BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldReceiveTouch:(UITouch*)touch {
if([touch.view isKindOfClass:[UISlider class]])
{
return NO;
}else{
return YES;
}
}
再次重申,iOS6没这个问题了
补充:ios6在模拟器上也是没有问题的,但在真机上就冲突了(UITapGesture和UIButton)
相关文章推荐
- 手势和UI控件之间冲突的解决方法(比如UITapGesture和UIButton冲突,UIPanGesture和UISlider冲突)
- 手势和UI控件之间冲突的解决方法(比如UITapGesture和UIButton冲突,UIPanGesture和UISlider冲突)
- 手势和UI控件之间冲突的解决方法(比如UITapGesture和UIButton冲突,UIPanGesture和UISlider冲突)
- 手势和UI控件之间冲突的解决方法(比如UITapGesture和UIButton冲突,UIPanGesture和UISlider冲突)
- IOS 使用自定义手势屏蔽按钮解决方法/UITapGestureRecognizer屏蔽Button
- UITapGestureRecognizer和UIButton的点击事件冲突的解决办法
- IOS 使用自定义手势屏蔽按钮解决方法/UITapGestureRecognizer屏蔽Button
- 关于手势之间的冲突的解决方法
- iOS 6.0之前 UITapGestureRecognizer手势和UIButton 点击事件冲突
- UITapGestureRecognizer和UIButton的点击事件冲突的解决办法
- iOS 关于UITapGestureRecognizer 单击与双击手势冲突的解决
- 解决UITapGestureRecognizer手势与UITableView的点击事件的冲突
- IOS 使用自定义手势屏蔽按钮解决方法/UITapGestureRecognizer屏蔽Button
- 做项目过程中遇到的问题及解决----UIGesture手势与UI控件点击的事件冲突解决
- UITapGestureRecognizer手势与UITableView冲突解决
- iOS UITapGestureRecognizer手势和UIButton 以及UITabelView点击事件冲突
- 如何解决UIScrollView中添加UITapGestureRecognizer跟UIButton点击事件冲突
- ios编程——使用抽屉MMDrawerController和系统手势interactivePopGestureRecognizer冲突的解决方法
- TimePicker在ScrollView中滑动冲突的解决方法(更新适用于全控件的方法)
- UITapGestureRecognizer 手势使用方法