1.手势识别
UITapGestureRecognizer(敲击)
UIPinchGestureRecognizer(捏合,用于缩放)
UIPanGestureRecognizer(拖拽)
UISwipeGestureRecognizer(轻扫)
UIRotationGestureRecognizer(旋转)
UILongPressGestureRecognizer(长按)
每一个特定的手势必须关联到view对象中才会有作用,一个view对象可以关联多个不同的特定手势,
但是每一个特定的手势只能与一个view相关联。当用户触摸了view,这个GestureRecognizer就会接受到消息,
它可以响应特定的触摸事件。
手势又分为离散手势和连续手势。
离散手势的特点就是一旦识别就无法取消,而且只会调用一次手势操作事件(初始化手势时指定的触发方法)。在六种手势识别中,只有一种手势是离散手势,它就是UITapGestureRecgnier。
连续手势的特点就是会多次调用手势操作事件,而且在连续手势识别后可以取消手势。从PPT最后一页的图可以看出两者调用操作事件的次数是不同的。其他五种手势是连续手势。
delaysTouchesBegan属性
@property(nonatomic)BOOLdelaysTouchesBegan;
手势识别失败前不执行触摸开始事件,默认为NO;如果为YES,
那么成功识别则不执行触摸开始事件,失败则执行触摸开始事件;如果为NO,则不管成功与否都执行触摸开始事件;
2.手势案例:
问题解答
案例中轻扫图片会引起拖动手势而不是轻扫手势。换句话说,两种手势发生了冲突。冲突的原因如下:
拖动手势的操作事件是在手势的开始状态(状态1)识别执行的,而轻扫手势的操作事件只有在手势结束状态(状态3)才能执行,因此轻扫手势就作为了牺牲品没有被正确识别。
如何解决这个冲突呢?
利用- (void)requireGestureRecognizerToFail:(UIGestureRecognizer*)otherGestureRecognizer;方法来完成。这个方法可以指定某个手势执行的前提是另一个手势失败才会识别执行。也就是说如果我们指定拖动手势的执行前提为轻扫手势失败就可以了,这样一来当我们手指轻轻滑动时系统会优先考虑轻扫手势,如果最后发现该操作不是轻扫,那么就会执行拖动。
如何让两个不同控件的手势同时执行?
利用代理的-(BOOL)gestureRecognizer:(UIGestureRecognizer*)
gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer
*)otherGestureRecognizer方法。
一个控件的手势识别后是否允许手势识别继续向下传播,默认返回NO;如果为YES,响应者链上层对象触发手势识别后,如果下层对象也添加了手势并成功识别也会继续执行,否则上层对象识别后则不再继续传播;