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

(0)

相关推荐

  • iOS手势密码的实现方法

    本次讲的手势密码,是在九个按键上实现的,这里讲的是手势密码的基本实现和效果 同样先上效果图 其实就是对画图功能的一个实现,再加上手势操作结合起来. 屏幕宽度高度,方便下面操作,不做解释 #define ScreenHeight [[UIScreen mainScreen] bounds].size.height #define ScreenWidth [[UIScreen mainScreen] bounds].size.width 控制器.m文件 这里的imageView是用来装手势画图之后的

  • 使用Swift代码实现iOS手势解锁、指纹解锁实例详解

    一.手势密码 1. 1.1.用UIButton组成手势的节点. 1.2.当手指接触屏幕时,调用重写的 touchesBegan:withEvent方法(在touchesBegan里调用setNeedsDisplay,这样就会自动调用drawRect方法). 1.3.当手指在屏幕上滑动时,调用重写的touchesEnded:withEvent方法. 这两个方法执行的操作是一样的:通过locationInView获取 触摸的坐标,然后用 CGRectContainsPoint 判断手指是否经过UIB

  • 基于JS实现Android,iOS一个手势动画效果

    废话不多说了,先给大家展示下效果图: 这是iOS下的效果,android下完全一致.通过do_GestureView组件和do_Animation组件,deviceone能很容易实现复杂的跨平台纯原生动画效果,这个示例就是通过手势控制图片上下动画滑动实现开合效果,还支持声音效果. 下面是主要的代码 //index.ui.js var do_Animator1 = mm("do_Animator"); do_Animator1.append(500, { y: -1334, curve:

  • iOS轻点、触摸和手势代码开发

    一.响应者链 以UIResponder作为超类的任何类都是响应者.UIView和UIControl是UIReponder的子类,因此所有视图和所有控件都是响应者. 1.初始相应器 事件首先会传递给UIApplication对象,接下来会传递给应用程序的UIWindow,UIWindow会选择一个初始相应器来处理事件.初始响应器会选择下面的方式选择1.对于触摸事件,UIWindow会确定用户触摸的视图,然后将事件交给注册了这个视图的手势识别器或则注册视图层级更高的手势识别器.只要存在能处理事件的识

  • iOS手势的实现方法

    本文实例为大家分享了iOS手势的具体实现代码,供大家参考,具体内容如下 效果 细节 1.UITouch #import "ViewController_0.h" @interface ViewController_0 () @property (nonatomic, strong)UILabel *label; @end @implementation ViewController_0 - (void)viewDidLoad { [super viewDidLoad]; self.la

  • iOS开发中的几个手势操作实例分享

    手势操作---识别单击还是双击 在视图上同时识别单击手势和双击手势的问题在于,当检测到一个单击操作时,无法确定是确实是一个单击操作或者只是双击操作中的第一次点击.解决这个问题的方法就是:在检测到单击时,需要等一段时间等待第二次点击,如果没有第二次点击,则为单击操作:如果有第二次点击,则为双击操作. 检测手势有两种方法,一种是定制子视图,重写视图从UIResponder类中继承来的事件处理方法,即touchesBegan:withEvent:等一系列方法来检测手势:另一个方法是使用手势识别器,即U

  • IOS手势操作(拖动、捏合、旋转、点按、长按、轻扫、自定义)

    下面通过图文并茂的方式给大家分享下IOS手势操作(拖动.捏合.旋转.点按.长按.轻扫.自定义)的相关内容. 1.UIGestureRecognizer 介绍 手势识别在 iOS 中非常重要,他极大地提高了移动设备的使用便捷性. iOS 系统在 3.2 以后,他提供了一些常用的手势(UIGestureRecognizer 的子类),开发者可以直接使用他们进行手势操作. UIPanGestureRecognizer(拖动) UIPinchGestureRecognizer(捏合) UIRotatio

  • iOS仿邮箱大师的九宫格手势密码解锁

    本文实例为大家分享了iOS手势密码解锁的相关代码,供大家参考,具体内容如下 // // LockView.m // 手势解锁 // // Created by Daniel on 16/4/4. // Copyright © 2016年 Daniel. All rights reserved. // #import "LockView.h" @interface LockView () /** 保存已选中的按钮 */ @property(nonatomic, strong) NSMut

  • iOS开发之触摸事件以及手势

    iOS中的事件分为三类:触摸事件.加速计事件.远程控制事件.只有继承了UIResponder的对象才能接收并处理事件,称之为"响应者对象".UIApplication.UIViewController.UIView都继承自UIResponder.UIResponder内部提供的方法来处理事件: 触摸事件:touchesBegan.touchesMoved.touchesEnded.touchesCancelled 加速计事件:motionBegan.motionEnded.motion

  • iOS实现手势解锁操作

    本文主要介绍通过手势识别实现手势解锁功能,这个方法被广泛用于手机解锁,密码验证,快捷支付等功能实现.事例效果如下所示. 首先,我们先分析功能的实现过程,首先我们需要先看大致的实现过程: 1.加载九宫格页面 2.实现按钮被点击及滑动过程中按钮状态的改变 3.实现滑动过程中的连线 4.绘制完毕后判定密码是否正确, 5.密码判定后实现跳转. 下面我们就来用代码实现上述五个过程. 1.加载九宫格界面 1.1九宫格内控件的分布 3*3 ,我们可以自定义view(包含3*3个按钮),添加到viewContr

随机推荐