美文网首页
UIEvent、UITouch、手势等等

UIEvent、UITouch、手势等等

作者: 8fe8946fa366 | 来源:发表于2018-04-17 20:08 被阅读359次

    1.什么是UIEvent

    UIEvent代表iOS系统中的一个事件,可以分为三类:UIEventTypeTouches触摸事件、UIEventTypeMotion运动事件、UIEventTypeRemoteControl远程事件。

    UIEventTypeTouches触摸事件,通过点击,拖拽,缩放等等触发。

    UIEventTypeMotion运动事件,通过摇晃屏幕等触发。

    UIEventTypeRemoteControl通过远程事件控制,或者耳机等触发。

    UIEvent继承于NSObject.

    2.什么是UIResponder

    在iOS当中,只有继承自UIResponder的类才能处理各种事件。

    我们常用的UIView、UIViewController、UIApplication都继承自UIResponder,它们都能接收并处理事件。

    @interface UIView : UIResponder<NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusEnvironment>

    UIResponder中提供了处理上述三种UIEvent的方法,根据事件的类型有不同的处理方法。

    3.什么是UITouch

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

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

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

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

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

    4.Gesture Recognizer

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

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

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

    5.UIControl

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

    🙋🌰:比如在viewa上添加了一个button,给这个button和这个views都添加了手势,那么views和button的手势都可以响应。因为UIButton继承于UIControl,也就是说如果UIButton是第一响应者,他的事件是由UIApplication直接派发的,不通过响应链传递,如果不能处理再交给响应链。

    而如果是刚才那种情况,给UIButton addTarget的话,这个target是不会被响应的。

    所以说这个action会因为父类的响应链被打断而无法执行,而gesture不会因为父类的响应链被打断而无法执行。

    6.事件响应逻辑

    当事件到来时,会通过hitTest和pointInside两个方法,从Window开始向上面的视图查找,找到第一响应者的视图。找到第一响应者后,系统会判断其是继承自UIControl还是UIResponder,如果是继承自UIControl,则直接通过UIApplication直接向其派发消息,并且不再向响应者链派发消息。

    如果是继承自UIResponder的类,则调用第一响应者的touchesBegin,并且不会立即执行touchesEnded,而是调用之后顺着响应者链向后查找。如果在查找过程中,发现响应者链中有的视图添加了手势,则进入手势的代理方法中,如果代理方法返回可以响应这个事件,则将第一响应者的事件取消,并调用其touchesCanceled方法,然后由手势来响应事件

    如果手势不能处理事件,则交给第一响应者来处理。如果第一响应者也不能响应事件,则顺着响应者链继续向后查找,直到找到能够处理事件的UIResponder对象。如果找到UIApplication还没有对象响应事件的话,则将这次事件丢弃。

    相关文章

      网友评论

          本文标题:UIEvent、UITouch、手势等等

          本文链接:https://www.haomeiwen.com/subject/mnppkftx.html