网站模板设计开发,黄骅港邮编号是多少,网络科技公司帮高校建设网站,厦门网站建设方案报价响应者链
iOS事件的3大类型
Touch Events(触摸事件)Motion Events(运动事件#xff0c;比如重力感应和摇一摇等)Remote Events(远程事件#xff0c;比如用耳机上得按键来控制手机)
触摸事件
处理触摸事件的两个步骤
寻找事件的最佳响应者事件的响应在响应链中的传递
寻…响应者链
iOS事件的3大类型
Touch Events(触摸事件)Motion Events(运动事件比如重力感应和摇一摇等)Remote Events(远程事件比如用耳机上得按键来控制手机)
触摸事件
处理触摸事件的两个步骤
寻找事件的最佳响应者事件的响应在响应链中的传递
寻找事件的最佳响应者
当我们触摸屏幕的某个可响应的功能点后最终都会由UIView或者继承UIView的控件来响应。
每个UIView对象都有一个 hitTest: withEvent: 方法这个方法是Hit-Testing过程中最核心的存在其作用是询问事件在当前视图中的响应者同时又是作为事件传递的桥梁。 当手指接触屏幕UIApplication接收到手指的触摸事件之后就会去调用UIWindow的hitTest: withEvent:方法
在hitTest: withEvent:方法中会调用pointInside: withEvent:去判断当前点击的point是否属于UIWindow范围内如果是就会以倒序的方式遍历它的子视图即越后添加的视图越先遍历
子视图也调用自身的hitTest: withEvent:方法来查找最终响应的视图
视图响应事件的条件
允许交互 userInteractionEnabled YES禁止隐藏hidden NO透明度alpha 0.01触摸点的位置通过 pointInside: withEvent:方法判断触摸点是否在视图的坐标范围内
事件的响应在响应链中的传递
经历Hit-Testing后UIApplication已经知道事件的最佳响应者是谁了接下来要做的事情就是
将事件传递给最佳响应者响应事件沿着响应链传递
事件传递给最佳响应者
最佳响应者具有最高的事件响应优先级因此UIApplication会先将事件传递给它供其响应。
UIApplication中有个sendEvent:的方法在UIWindow中同样也可以发现一个同样的方法。UIApplication是通过这个方法把事件发送给UIWindow然后UIWindow通过同样的接口把事件发送给最佳响应者。
当事件传递给最佳响应者后响应者响应这个事件则这个事件到此就结束了它会被释放。假设响应者没有响应这个事件那么它将何去何从事件将会沿着响应链自上而下传递。 注意 寻找最佳响应者中也说到了事件的传递与此处所说的事件的传递有本质区别。上面所说的事件传递的目的是为了寻找事件的最佳响应者是自下而上父视图到子视图的传递而这里的事件传递目的是响应者做出对事件的响应这个过程是自上而下子视图到父视图的。前者为“寻找”后者为“响应”。 事件沿着响应链传递
在UIKit中有一个类UIResponder它是所有可以响应事件的类的基类。UIApplicationUIViewController和UIView都是继承自它都有一个 nextResponder 方法用于获取响应链中当前对象的下一个响应者也通过nextResponder来串成响应链。
响应者对于事件的拦截以及传递都是通过 touchesBegan:withEvent: 方法控制的该方法的默认实现是将事件沿着默认的响应链往下传递。
响应者对于接收到的事件有3种操作
不拦截默认操作 事件会自动沿着默认的响应链往下传递拦截不再往下分发事件 重写 touchesBegan:withEvent: 进行事件处理不调用父类的 touchesBegan:withEvent:拦截继续往下分发事件 重写 touchesBegan:withEvent: 进行事件处理同时调用父类的 touchesBegan:withEvent: 将事件往下传递
总结
触摸事件先通过自下而上(父视图–子视图)的传递方式寻找最佳响应者
然后以自上而下(子视图–父视图)的方式在响应链中传递。