iOS开发之手势识别

 更新时间:2016年04月28日 08:55:09   作者:执着丶执念  
本文给大家汇总介绍了在IOS开发中我们经常需要用到的手势识别的相关知识,非常的细致全面,有需要的小伙伴可以参考下

一、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输入框(UITextField)密码明暗文切换方法

    iOS输入框(UITextField)密码明暗文切换方法

    这篇文章主要介绍了iOS输入框(UITextField)密码明暗文的切换方法,代码简短实用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • 详解iOS 裁剪圆形图像并显示(类似于微信头像)

    详解iOS 裁剪圆形图像并显示(类似于微信头像)

    本篇文章主要介绍了iOS 裁剪圆形图像并显示(类似于微信头像),具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • iOS实现图片轮播器

    iOS实现图片轮播器

    这篇文章主要为大家详细介绍了iOS如何实现图片轮播器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • IOS 文件读写操作详解及简单实例

    IOS 文件读写操作详解及简单实例

    这篇文章主要介绍了IOS 文件读写操作详解及简单实例的相关资料,需要的朋友可以参考下
    2017-04-04
  • 详解iOS应用中自定义UIBarButtonItem导航按钮的创建方法

    详解iOS应用中自定义UIBarButtonItem导航按钮的创建方法

    这篇文章主要介绍了iOS应用中自定义UIBarButtonItem导航按钮的创建方法,文中举了一个自定义图片的UIBarButtonItem实例,比较具有代表性,需要的朋友可以参考下
    2016-04-04
  • iOS开发之(APNS)远程推送实现代码 附证书与真机调试

    iOS开发之(APNS)远程推送实现代码 附证书与真机调试

    这篇文章主要为大家详细介绍了iOS开发之(APNS)远程推送实现代码,附证书与真机调试,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • 浅析iOS的Xcconfig

    浅析iOS的Xcconfig

    本篇文章介绍IOS中Xcconfig的相关知识内容,有兴趣的朋友学习下吧。
    2018-01-01
  • iOS App开发中的UISegmentedControl分段组件用法总结

    iOS App开发中的UISegmentedControl分段组件用法总结

    UISegmentedControl主要被用来制作分页按钮或添加跳转到不同位置的标签,这里我们就来看一下iOS App开发中的UISegmentedControl分段组件用法总结,需要的朋友可以参考下
    2016-06-06
  • IOS本地日志记录解决方案

    IOS本地日志记录解决方案

    我们在项目中日志记录这块也算是比较重要的,有时候用户程序出什么问题,光靠服务器的日志还不能准确的找到问题。本文详细介绍了IOS本地日志记录解决方案。下面跟着小编一起来看下吧
    2017-03-03
  • iOS 断点上传文件的实现方法

    iOS 断点上传文件的实现方法

    这项目开发中,有时候我们需要将本地的文件上传到服务器,简单的几张图片还好,但是针对iPhone里面的视频文件进行上传,为了用户体验,我们有必要实现断点上传。这篇文章主要介绍了iOS 断点上传文件的实现方法,需要的朋友可以参考下
    2017-12-12

最新评论