随笔 - 262  文章 - 0  评论 - 5  阅读 - 20万

【iOS入门】触屏事件处理

一:UIEvent 

复制代码
ios事件的四种类型(指定事件的一般类型):

typedefNS_ENUM(NSInteger, UIEventType) { 

UIEventTypeTouches,   //触摸事件

UIEventTypeMotion,   //运动事件

UIEventTypeRemoteControl,   //远程控制事件

UIEventTypePresses NS_ENUM_AVAILABLE_IOS(9_0), //按压事件

};
复制代码
复制代码
获取触摸事件:

//返回与事件关联的所有触摸

@property(nonatomic, readonly, nullable) NSSet *allTouches;

//从给定视图的事件返回触摸对象

- (nullable NSSet *)touchesForView:(UIView *)view;

//从指定窗口的事件返回触摸对象

- (nullable NSSet *)touchesForWindow:(UIWindow *)window;

//返回与指定的主触控关联的所有触摸

- (nullable NSArray *)coalescedTouchesForTouch:(UITouch *)touch NS_AVAILABLE_IOS(9_0);

//返回指定触摸的预计发生的触摸数组

- (nullable NSArray *)predictedTouchesForTouch:(UITouch *)touch NS_AVAILABLE_IOS(9_0);
复制代码

 

二:UITouch

复制代码
什么是UITouch
当用户的一根手指触摸屏幕的时候会创建一个对应的UITouch,这个UITouch会记录手指运动的信息,比如说位置,时间,阶段等等。手指在屏幕的时候系统会更新同一个UITouch对象,如果手指离开了屏幕,这个UITouch对象就被销毁了。

我们可以发现处理点击事件的方法里有两个参数。

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event

一次完整的触摸事件只会产生一个UIEvent对象,也就是说不管手指在屏幕上怎么移动都是一个UIEvent对象。

而touches这个NSSet里面,装着的是UITouch对象,从这个里面可以看出是单点触摸还是多点触摸。
也就是说两个手指同时触摸屏幕,那么touches里就有两个UITouch对象。
复制代码

三:Gesture Recognizer

如果有事件到来时,视图有附加的手势识别器,则手势识别器优先处理事件。如果手势识别器没有处理事件,
则将事件交给视图处理,视图如果未处理则顺着响应者链继续向后传递。

也就是说手势识别器的优先级高于事件处理。如果手势在事件响应链中,那么手势会把这个响应链打断。

比如说现在有两个view,viewb在viewa的上面,两个view都添加了手势,那么我们点击viewa的时候可以响应,
但是点击viewb的时候就没有响应了,这就是因为viewa上添加了手势打断了响应链,所以viewb响应不到这个点击事件了。

四:UIControl

复制代码

UIControl对于事件的处理会打破上面的规则。

比如在viewa上添加了一个button,给这个button和这个views都添加了手势,那么views和button的手势都可以响应。
因为UIButton继承于UIControl,也就是说如果UIButton是第一响应者,他的事件是由UIApplication直接派发的
不通过响应链传递,如果不能处理再交给响应链。 而如果是刚才那种情况,给UIButton addTarget的话,这个target是不会被响应的。 所以说这个action会因为父类的响应链被打断而无法执行,而gesture不会因为父类的响应链被打断而无法执行。
复制代码

五:事件响应逻辑

复制代码

当事件到来时,会通过hitTest和pointInside两个方法,从Window开始向上面的视图查找,
找到第一响应者的视图。找到第一响应者后,系统会判断其是继承自UIControl还是UIResponder
如果是继承自UIControl,则直接通过UIApplication直接向其派发消息,并且不再向响应者链派发消息。 如果是继承自UIResponder的类,则调用第一响应者的touchesBegin,并且不会立即执行touchesEnded,
而是调用之后顺着响应者链向后查找。如果在查找过程中,发现响应者链中有的视图添加了手势,
则进入手势的代理方法中,如果代理方法返回可以响应这个事件,则将第一响应者的事件取消,
并调用其touchesCanceled方法,然后由手势来响应事件。 如果手势不能处理事件,则交给第一响应者来处理。如果第一响应者也不能响应事件,
则顺着响应者链继续向后查找,直到找到能够处理事件的UIResponder对象。
如果找到UIApplication还没有对象响应事件的话,则将这次事件丢弃。
复制代码

 

 

 优秀博文 :

https://www.jianshu.com/p/cb0314b72883?nomobile=yes

https://www.jianshu.com/p/71ab5dfd1e95

 
posted on   wp7ers  阅读(164)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2018-01-17 android 注入框架 DI
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示