ios手势识别代理

之前做优质派时写了一篇文章,由于当时做项目时这个主控制器就是RootViewController,虽然用的是ScrollView但也没考虑到导航栏的手势返回的问题 ,现在做小区宝3.0的闪购订单,用之前的就有问题了。导航栏的返回手势用不了,根据响应者链和响应事件,手势被ScrollView识别了,就到不了导航的手势识别,所以导致无法手势返回。

要解决这个问题首先要了解下手势识别代理:

iOS的手势识别模型其实是一个状态机

所有手势识别从一个可能状态(UIGestureRecognizerStatePossible)开始,然后开始分析、识别手势,如果识别失败将会进入失败状(UIGestureRecognizerStateFailed)。
如果识别成功,进入成功状态(UIGestureRecognizerStateRecognized)
对于连续性的手势,手势识别从Possible进入Began(UIGestureRecognizerStateBegan) ,然后会进入Change (UIGestureRecognizerStateChanged)状态,并在Change状态循环,在最后用户手指离开屏幕的时候会进入End(UIGestureRecognizerStateEnded)状态
连续手势也会从Change进入cancel (UIGestureRecognizerStateCancelled),如果判断手势已经不符合该要求了。
每次Gesture recognizer改变状态的时候都会发送一个action message到target,知道Failed或者Cancel。
有时候会出现iOS判断该手势符合多个条件,而用户此时只想要其中一种,这个情况下可以调用 requireGestureRecognizerToFail: ,该方法会让当前手势对象根据指定对象状态来进行下一步操作。如果指定对象进入Begin状态,当前对象直接进入Failed;如果指定对象进入Failed或Cancel状态,当前对象会进入Begin状态。这里就涉及到了不同手势之间执行的问题。(如果想要单击和双击都要执行,并分别执行不同的逻辑,这里可以先让单机等待双击失败在执行,但这样会导致单击事件稍微延迟执行,因为单击事件需要等待双击事件失败)。
可以选择不让接收、分析手势事件,通过 gestureRecognizer:shouldReceiveTouch: 在最开始的时候允许、拒绝接收手势时间;如果想延后判断则可以通过 gestureRecognizerShouldBegin:,如果返回No则会导致Failed时间
如果想要同时接收两个事件,就调用gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: 默认这个方法返回No,返回Yes则运行同时运行
单向影响,事件A和B, 如果想要让A影响B,但不想让B影响A,则可以通过重载方法 canPreventGestureRecognizer: 或者canBePreventedByGestureRecognizer:实现,比如
[rotationGestureRecognizer canPreventGestureRecognizer:pinchGestureRecognizer];
Touch事件传递过程是上到下,也就是从App->Window->View的过程
Touch事件,window会让Gesture recognizer优先分析touch对象,如果Gesture recognizer成功识别这些对象,touch事件就不会执行。总结就是Gesture recognizer的优先级会低于touch事件
影响touch传递给views
delaysTouchesBegan 阻止在Begin阶段Windows交付touch事件
delaysTouchesEnded Window不会在Enable阶段交付Touch事件
Gesture Recognizer是iOS定制的一些Touch事件类型,Dev可以订制自己的Gesture Recognizer,这里要继承UIGestureRecognizer并覆盖主要的四个类。

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;

返回值是返回是否生效。此方法在gesture recognizer视图转出UIGestureRecognizerStatePossible状态时调用,如果返回NO,则转换到UIGestureRecognizerStateFailed;如果返回YES,则继续识别触摸序列.(默认情况下为YES)

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

这个方法返回值是用来表示手势是否共存的。只要返回YES,另外就不用管了,因为共存,所以共存,共同响应.也就是说两个gesture recognizers的delegate方法只要任意一个返回YES,则这两个就可以同时识别;只有两个都返回NO的时候,才是互斥的。默认情况下是返回NO。

一个控件的手势识别后是否阻断手势识别继续向下传播,默认返回NO;如果为YES,响应者链上层对象触发手势识别后,如果下层对象也添加了手势并成功识别也会继续执行,否则上层对象识别后则不再继续传播;

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0);
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0);

这个两个成对的方法比较有趣,一个是前面失效后面生效,另外一个相反

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;

在toucheBegan这个方法之前,也就是在手势状态为began之前?

此方法在window对象在有触摸事件发生时,调用gesture recognizer的touchesBegan:withEvent:方法之前调用,如果返回NO,则gesture recognizer不会看到此触摸事件。(默认情况下为YES).

时间: 2024-08-31 23:44:00

ios手势识别代理的相关文章

iOS设计模式 - 代理

iOS设计模式 - 代理   原理图   说明 1. 代理模式大家都用过,但用抽象基类NSProxy实现代理估计鲜有人用 2. 本人用NSProxy实现了代理模式,对于理解消息转发机制有点帮助   源码 https://github.com/YouXianMing/iOS-Design-Patterns // // AbstractProxy.h // AppProxy // // Created by YouXianMing on 15/8/4. // Copyright (c) 2015年

ios-关于IOS协议代理方法自动调用问题?

问题描述 关于IOS协议代理方法自动调用问题? 各位大牛好, 想问一个关于IOS协议代理的问题: 是否通过遵守某个协议,实现了其中的方法,对于这些方法来说,大多数情况下是 视图对象对其进行自动调用的吗? 例如:当表格不知道自己的行高,就去找实现了相关方法的代理?找它实现的相关方法 来自动获得行高? 小弟不太理解代理与协议方面的知识,希望可以有大牛解答,谢谢. 解决方案 你理解的不错,的确是这样,但是少了一步.除了遵守协议,实现方法之外,还要把自身设置成被委托对象.....delegate =se

iOS手势识别的详细使用方法(拖动,缩放,旋转,点击,手势依赖,自定义手势)_IOS

手势识别在iOS上非常重要,手势操作移动设备的重要特征,极大的增加了移动设备使用便捷性. 1.UIGestureRecognizer介绍 手势识别在iOS上非常重要,手势操作移动设备的重要特征,极大的增加了移动设备使用便捷性. iOS系统在3.2以后,为方便开发这使用一些常用的手势,提供了UIGestureRecognizer类.手势识别UIGestureRecognizer类是个抽象类,下面的子类是具体的手势,开发这可以直接使用这些手势识别. UITapGestureRecognizer  U

iOS UITableView代理方法详解

IOS UITableView的代理方法详解 一.补充 在上一篇博客中,http://my.oschina.net/u/2340880/blog/404605,我将IOS中tableView(表视图)的一些常用方法总结了一下,这篇将tableView的代理方法作了总结,对上一篇博客进行了补充. 二.UITableViewDataSourc(数据源代理) 1.必须实现的回调方法 返回每个分区的行数 - (NSInteger)tableView:(UITableView *)tableView nu

iOS通过代理逆向传值的方式详解_IOS

前言 在iOS开发中,常见的几种逆向传值方式,有代理(delegate).通知(NSNotification),block等等,本文就给大家分析下,如何理解和快速上手代理模式,并以一个简单的逆向传值为案例,看看代理模式是不是很难. 一.代理模式中的几个概念 讲代理模式之前,首先需要弄清楚两个概念:被代理对象和代理对象.并且需要知道它们之间是靠协议关连起来的. 1.被代理对象 被代理对象往往就是真正有做事意图的那个对象,比如卖房子案例中的想卖房子的房主,保姆婴儿案例中想喝奶的婴儿.但是它们自己做不

iOS利用代理实现界面跳转

  引入代理类头文件和要跳转到的界面头文件 -(void)aaa { //可以插入动画 LYXViewControllor * view = [LYXViewControllor new]; LYXDelegate * dingDong = [UIApplacation sharedApplacation].delegate; dingDong.window.rootViewControllor = view; }

iOS - Delegate 代理

1.Delegate 1.1 协议 协议:是多个类共享的一个方法列表.协议中列出的方法没有相应的实现,计划由其他人来实现.协议中列出的方法,有些是可以选择实现,有些是必须实现. 1>.如果你定义了自己的协议,那么不必由自己实现它.但是,这就告诉其他程序员,如果要采用这项协议,则必须实现这些方法.这些方法可以从超类继承. 协议不引用任何类,它是无类的. 分类也可以采用一项协议. 2>.定义一个协议很简单:只要使用 @protocol 指令,后面跟上你给出的协议名称.定义一项协议时,可以扩展现有协

你真的了解iOS代理设计模式吗?

本文是投稿文章,作者:刘小壮 在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递一些参数.这篇文章会涵盖代理的使用技巧和原理,以及代理的内存管理等方面的知识.我会通过这些方面的知识,带大家真正领略代理的奥妙.写的有点多,但都是干货,我能写下去,不知道你有没有耐心看下去.本人能力有限,如果文章中有什么问题或没有讲到的点,请帮忙指出,十分感谢! iOS中消息传递方式 在iOS中有很多种消息传递方式,这里先简单介绍一下各种消息传递方式. 通知:在iOS中由通

delegate 代理-IOS代理协议方法是如何被调用的?

问题描述 IOS代理协议方法是如何被调用的? 这几天一直在思考代理的工作原理.代理可以获得事件或数据信息.调用与此信息相关的方法.把信息传给该方法,实现对事件或数据信息的回应. 这里我最大的疑惑是,代理如何把事件与方法对应起来?例如:A对象定义了一组代理协议,B对象作为A的代理,实现了所有的协议方法,当某个事件发生时,A的代理如何知道应该调用哪个协议方法?是根据方法名吗?我怀疑是因为所有代理都继承自NSObject协议,这一组协议可能使代理具有了神奇的功能. 另一个令我疑惑的事情是,自定义代理与