关于多种手势,区分的问题。
IOS 中常有的手势:
1.单击手势,双击搜索 Tap
2.长按手势 Long
3.划动手势 Swipe
4.旋转手势 Rotation
5.捏合手势 Pinch
6.拖动手势 Pan
关于多种手势识别,区分的问题。
/////特别强调下,在一个对象上面同时有 单击手势 双击手势 的时候
如何区分 它们了?
最简单的办法:(此方法用来设置优先级)
[singleTapGesture requireGestureRecognizerToFail:doubleTapGesture];
说明上面的方法: 只有 双击手势 识别失败后,则 才识别 单击手势。
以此来设置优先级。区分不同的手势。
参考博文:
http://www.winddisk.com/2012/10/17/detect_double_tap_single_tap/
http://blog.csdn.net/likendsl/article/details/7554150
/////下面的内容很重要,对于区分手势
不过有些手势是关联的,怎么办呢?例如 Tap 与 LongPress、Swipe与 Pan,或是 Tap 一次与Tap 兩次。
手势识别是具有互斥的原则的,比如单击和双击,如果它识别出一种手势,其后的手势将不被识别。所以对于关联手势,要做特殊处理以帮助程序甄别,应该把当前手势归结到哪一类手势里面。
比如,单击和双击并存时,如果不做处理,它就只能发送出单击的消息。为了能够识别出双击手势,就需要做一个特殊处理逻辑,即先判断手势是否是双击,在双击失效的情况下作为单击手势处理。使用
[A requireGestureRecognizerToFail:B]函数,它可以指定当A手势发生时,即便A已经滿足条件了,也不会立刻触发,会等到指定的手势B确定失败之后才触发。
可能会遇到的问题
http://blog.sina.com.cn/s/blog_bf9eee6f0101izxh.html
////////////////很重要
首先让UITapGestureRecognizer不要吃掉子窗口的事件:
tapGesture.cancelsTouchesInView = NO; (这是一个比较关键的问题)然后设置自身的代理:tapGesture.delegate = self;最后实现代理里面这个方法:// called before touchesBegan:withEvent: is called on the gesture recognizer for a new touch. return NO to prevent the gesture recognizer from seeing this touch- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ // 过滤掉UIButton,也可以是其他类型 if ( [touch.view isKindOfClass:[UIButton class]]) { return NO; } return YES;}