一、UIGestureRecognizer简单介绍
我们已经学习了触摸事件处理,但触摸事件处理起来很麻烦,每个触摸事件处理都需要实现3个touches方法,比较繁琐,实际上我们可以使用更加简单的触摸事件处理操作,那就是 手势识别UIGestureRecognizer 。
手势识别操作基类UIGestureRecognizer不能直接使用,我们常使用的是它的子类,这些手势操作类都继承自UIGestureRecognizer类
常用手势识别子类:
点按手势 UITapGestureRecognizer
捏合手势 UIPinchGestureRecognizer
拖动手势 UIPanGestureRecognizer
轻扫手势 UISwipeGestureRecognizer【4个方向分离】
旋转手势 UIRotationGestureRecognizer
长按手势 UILongPressGestureRecognizer
二、UIGestureRecognizer属性
对象属性:
@property (nonatomic , readonly) UIGestureRecognizerState state;/*< 手势状态 */ @property (nonatomic , getter=isEnabled) BOOL enabled;/*< 手势是否可用 */ @property (nonatomic , readonly) UIView *view;/*< 触发手势的视图 */ @property (nonatomic , assign) BOOL delaysTouchesBegan;/*< 手势识别失败前不执行触摸开始事件,默认为NO */
手势识别状态state:
typedef NS_ENUM(NSInteger, UIGestureRecognizerState) { UIGestureRecognizerStatePossible, // 尚未识别是何种手势操作(但可能已经触发了触摸事件),默认状态 UIGestureRecognizerStateBegan, // 手势已经开始,此时已经被识别,但是这个过程中可能发生变化,手势操作尚未完成 UIGestureRecognizerStateChanged, // 手势状态发生转变 UIGestureRecognizerStateEnded, // 手势识别操作完成(此时已经松开手指) UIGestureRecognizerStateCancelled, // 手势被取消,恢复到默认状态 UIGestureRecognizerStateFailed, // 手势识别失败,恢复到默认状态 UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // 手势识别完成,同UIGestureRecognizerStateEnded };
左图为 短手势 的状态转变,右图为 长手势 的状态转变
三、UIGestureRecognizer方法
#pragmX mark 添加触摸执行事件 - (void)addTarget:(id)target action:(SEL)action; #pragma mark 移除触摸执行事件 - (void)removeTarget:(id)target action:(SEL)action; #pragma mark 触摸点的个数(同时触摸的手指数) - (NSUInteger)numberOfTouches; #pragma mark 在指定视图中的相对位置 - (CGPoint)locationInView:(UIView*)view; #pragma mark 触摸点相对于指定视图的位置 - (CGPoint)locationOfTouch:(NSUInteger)touchIndex inView:(UIView*)view; #pragma mark 指定一个手势需要另一个手势执行失败才会执行 - (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer;
四、UIGestureRecognizer使用
# 创建手势识别器对象 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init]; # 设置手势识别器对象的具体属性 tap.numberOfTapsRequired = 2; // 连续敲击2次 tap.numberOfTouchesRequired = 2;// 需要2根手指一起敲击 # 添加手势识别器到对应的view上 [self.myView addGestureRecognizer:tap]; # 监听手势的触发 [tap addTarget:self action:@selector(tapView:)];
五、多手势冲突
在iOS中,如果一个手势A的识别部分是另一个手势B的子部分,默认情况下A就会先识别,B就无法识别了,
比如拖动手势A和轻扫手势B,轻扫手势只在手势结束状态才能执行,而拖动手势在手势开始的时候执行,这两个手势一起触发,轻扫手势就成了牺牲品。
解决手势冲突,就是利用一个方法:
-(void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer
该方法指定一个手势需要另外一个手势识别失败才会执行
比如解决拖动手势和轻扫手势冲突:
// 拖动手势的执行需要右轻扫手势的失败为前提 [panGesture requireGestureRecognizerToFail:swipeGestureToRight]; // 拖动手势的执行需要左轻扫手势的失败为前提 [panGesture requireGestureRecognizerToFail:swipeGestureToLeft];
六、UIGestureRecognizerDelegate代理
代理方法:
#pragma mark 一个控件识别手势后是否沿着响应者链条继续传播手势识别,默认返回NO - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
用该代理方法可以实现两个不同控件的手势同时执行,需要让该方法返回YES,手势识别就能传递给不同控件
本文向大家介绍iOS开发之手势识别实例,包括了iOS开发之手势识别实例的使用技巧和注意事项,需要的朋友参考一下 感觉有必要把iOS开发中的手势识别做一个小小的总结。下面会先给出如何用storyboard给相应的控件添加手势,然后在用纯代码的方式给我们的控件添加手势,手势的用法比较简单。和button的用法类似,也是目标 动作回调,话不多说,切入今天的正题。 总共有六种手势识别:轻击手势(TapGe
本文向大家介绍iOS UIPan手势识别器,包括了iOS UIPan手势识别器的使用技巧和注意事项,需要的朋友参考一下 示例 平移手势识别器可检测到拖动手势。以下示例将图像添加到视图控制器,并允许用户在屏幕上四处拖动图像。 目标C 迅速 注意:尽管UIPanGestureRecognizer对于检测任何拖动手势很有用,但是如果您只想检测基本手势(例如用户向左/向右或向上/向下拖动手指),请使用UI
本文向大家介绍AndroidStudio:手势识别,包括了AndroidStudio:手势识别的使用技巧和注意事项,需要的朋友参考一下 一内容:设计一个手写字体识别程序。 二实现 ①建立一个存放手写字体的数据库 ②activity_main.xml 3.MainActivity.java 三效果 以上所述是小编给大家介绍的AndroidStudio手势识别详解整合,希望对大家有所帮助,如果大家有任
本文向大家介绍iOS轻点、触摸和手势代码开发,包括了iOS轻点、触摸和手势代码开发的使用技巧和注意事项,需要的朋友参考一下 一、响应者链 以UIResponder作为超类的任何类都是响应者。UIView和UIControl是UIReponder的子类,因此所有视图和所有控件都是响应者。 1、初始相应器 事件首先会传递给UIApplication对象,接下来会传递给应用程序的UIWindow,UIW
本文向大家介绍IOS开发之手势响应事件优先级的实例详解,包括了IOS开发之手势响应事件优先级的实例详解的使用技巧和注意事项,需要的朋友参考一下 IOS开发之手势响应事件优先级的实例详解 交互响应事件都是通过手势的操作完成的,如点击、或双击、或长按,这些交互都是在视图中完成的,但是不同的视图可能会有不同的交互,有时候就会出现交互响应事件冲突的情况。这时候就需要处理事件优先级,以便达到想要的效果。 示
本文向大家介绍Android手势识别功能,包括了Android手势识别功能的使用技巧和注意事项,需要的朋友参考一下 现在智能手机基本都是触摸操作,点击按钮是一种交互方式,同时手势相关的操作,比如滑动等等同样是很重要的交互方式。这篇文章是对安卓手势交互相关知识点的整理和总结,主要来源基于官方文档。 触摸交互中的概念 常用事件 首先要了解一些常用的事件: ACTION_DOWN:第一个手指按下 ACT