IOS 开发 手势使用

IOS 开发 手势使用


首先为了防止看我的博客的人刚打开就关闭,所以就先给个手势的例子

 

1

2

3

4

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapView:)];

tapGesture.numberOfTapsRequired = 1;

tapGesture.numberOfTouchesRequired = 1;

[self.view addGestureRecognizer:tapGesture];

话说回来,如果直接讲例子以及如何使用函数,没多大意思,而且这种东西就成了记单词,不好不好实在不好,了解下机理,那就不用背单词了,不论怎样变都无所谓了。上个博客讲了事件的传播途径和顺序。那么本次就说说如何在这样的大前提下,做些设置来适应特殊的需求。

首先来讲一下手势的识别和touch事件和处理手势的target之间的关系。如下图:

 

\

当用户触摸屏幕,会有touchbegin 事件,然后触摸也可以移动,也会有touchmove,然后离开就会有touchend时间,总的来说touch事件有一下三个阶段:< "http://www.2cto.com/kf/ware/vc/" target="_blank"class="keylink">vcD4KPHA+PC9wPgo8aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20140417/2014041709211089.png"alt="\">

首先touchbegin ,之后用户移动的的话会进入touchmove,然后手指离开就会有touchend,用户也可以直接离开,就直接冲touchbegin tauchend 无论哪个阶段,ios都会将这些阶段包裹成一个touch事件,先传给手势们,手势会分析这些事件,改变自己的状态,然后发送消息给targettarget就会调用处理函数进行事件处理。什么是手势状态改变。看下图 

\

 

加载中...

这个图是手势的状态迁移自动机,左边是不连续的单一手势,右边是连续的手势。 手势刚开始默认处于possible状态,当分析出可以识别时,单一分离手势立马变为recognized状态,并发送消息给target,不识别就变为Failed,但不发消息给target 连续的手势,当初次识别时,其从possible变为begin状态,然后发送消息给target,然后继续分析touch事件,然后处于change,发送消息给target,当变化后不符合该手势的模式时,就变为canceled状态,但不发送消息给target,如果touch end时间来了后,就变为recognized,并发送消息给target 总之在状态变化的时候会发送消息给target,但变化的目标状态是 canceled 或者 failed的话,是不发送消息给target的。还有当处于recognizedend)状态是,ios会把手势的状态重新置为possible状态,但不发消息给target 讲了这么多下来就讲如何满足特定需求。先看一下两个手势的代理函数 

gestureRecognizer:shouldReceiveTouch:

gestureRecognizerShouldBegin:

gestureRecognizer:shouldReceiveTouch是当iOS访问在传递touch事件之前会询问手势的代理,问是否要传递touch时间给这个手势。默认为YES,表明是传,为NO的话,表明是不传,不传就表明手势的状态是不可能发生改变的,也就是说手势就当什么也没发生过。

gestureRecognizerShouldBegin:这个就不一样了,首先可以肯定touch事件肯定传递给它了,但是如果这个函数返回NO,那么改手势的状态立马为failed,这个函数有什么用呢,当你一个view上同时加了手势和touchend事件后,你可以在这个函数里面做控制让你的touchend先相应,当touchend不相应的话,你可以在这个函数里面在做判断,让其返回YES,手势就又可以用了,这个就改变了touch事件和手势的优先级。但是这个不是说touchend不识别的时候,当前的touch事件还会传递给手势,这个只是在touch时间在传递给view的时候,让手势不去过滤。

如何解决手势冲突?

当一个viewA手势的识别部分是B手势识别的子部分时,默认情况下A就先识别了,B就识别不了了,如何解决这个

[ArequireGestureRecognizerToFail:B];

这样的话,就是A在识别事件之前看B的状态,如果B是不是Fail状态,如果不是,就等待,A的状态依然是possible。当BFailed的话,就开始识别。

这样就可以满足上述要求了。

我们都知道当touch事件发生后,ios会将事件发送给view的手势们,但是谁先谁后是不定的,在默认情况下,先识别的的手势会阻断继续传播,如果我现在有个需求是要求两个手势同时识别,怎么办?

gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:这个代理函数默认返回NO,也就是会识别后阻断传播,如果返回为YES那么就不会阻断继续传播

当我们需要在响应A手势的时候,不响应B,但响应B的时候要相应A,怎么办

canPreventGestureRecognizer

canBePreventedByGestureRecognizer:

这两个函数会讲两个手势简历一个单向依赖关系,[A canPreventedByGestureRecognizer: B];

响应A手势的时候,不响应B,但响应B的时候要相应A

这部分的使用都是基于事件是否传播到手势上去做的。

接下来就是,事件传播到手势后,手势没有失败之前对事件进行过滤

当我需要在我的手势没有失败之前,view不准识别任何touch event。怎么办

delaysTouchesBegan 默认为NO,如果设置为YES,就表明手势没有失败之前,view收不到touch begin事件。

其次当iOS发出touch end的时候,手势仍然没有识别,但是也么有处于失败状态,这个时候我们想让view收到touch end事件,怎么办?

delaysTouchesEnded设置为NO(默认为YES

总结,有事件的传输路径和次序,已经由ios规定好了,那么以上的方法也就是在这个基础上做的,有的事在将要通知手势发生了touch事件前,有的事之后。总之,分析手势的时候一定时时刻刻想到touch事件的传播。

好了手势的使用基本上将的差不多了,希望大家能多提意见

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值