一、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,手势识别就能传递给不同控件

最新文章

  1. WPF如何仿制QQ2013登录窗口的关闭效果
  2. c51
  3. SDWebImage笔记
  4. 安装phonegap
  5. POJ 3074 Sudoku (Dacing Links)
  6. Django“少折腾”
  7. C/C++数据在内存中的存储方式
  8. navicat使用ssh登录mysql报错:expected key exchange group packet from server
  9. VMVare 虚拟机使用桥接模式
  10. zlib 简单封装
  11. ubuntu12.04安装Docker
  12. mongodb基础环境搭建
  13. PAT甲题题解-1049. Counting Ones-数学问题
  14. Oracle 11g新特性 Interval Partition
  15. MySQL学习笔记:三种组内排序方法
  16. blender, 创建多边形面片
  17. 【刷题】BZOJ 1001 [BeiJing2006]狼抓兔子
  18. 安装Windows Service总是发生异常!
  19. ubuntu更新root密码
  20. POJ2406 Power Strings 【KMP 或 后缀数组】

热门文章

  1. SQL server 数据库基础语句 子查询 基础函数
  2. POJ 3162 Walking Race (树的直径,单调队列)
  3. C++数据文件存储与加载(利用opencv)
  4. python之for (循环)
  5. Flask——基础知识
  6. shell脚本,通过传入的参数来计算最大值和最小值以及平均值。
  7. Mac电脑怎么显示隐藏文件、xcode清除缓存
  8. swift中使用sqlite3
  9. vue循环出来列表里面的列表点击click事件只对当前列表有效;
  10. js中的跨域方法总结