iOS响应链原理

ios找到被点击的view的过程是从根view开始递归地调用hitTest方法,直到有一个子view的hitTest方法返回自身;如果所有一级子view的hitTest方法都返回nil,那么根view就返回自己。

应用hitTest方法,hitTest方法的作用是返回被点击的view,只返回一个。

每个view都会有hitTest方法,hitTest方法里面会去调用pointInside方法来判断点击的点是否在自己的view范围内,hitTest返回自身view的条件是自身的hitTest方法被调用,自己的pointInside方法返回true,没有子view或者所有子view的hitTest方法返回nil。(另一种理解方法是点击的点在父view的范围内,父view才有可能会去调用子view的hitTest方法,这里说有可能的原因是 如果父view的userInteractionEnabled  == NO 时,父view的hitTest方法会直接返回nil, 子view的hitTest方法也不会被调用)

hitTest方法大致的内容

-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event {

//一些判断条件,比如userInteractionEnabled == NO 时直接返回nil

if([self pointInside:point withEvent:event]) {

for(UIView *subView in self.subViews) {

UIView *hitView = [subView hitTest:point withEvent:event];

if(hitView) {

return hitView;

}

}

return self;

}

return nil;

}

时间: 2024-10-08 17:09:57

iOS响应链原理的相关文章

iOS 响应链

iOS 响应链 原文  http://blog.csdn.net/yadong000/article/details/8837241 首先要明确的是:在IOS中,有响应者链对事件进行响应,所有的响应类都是UIResponder的子类,响应者链是一个由不同对象组成的层次结构,其中的每个对象将依次获得响应事件消息的机会. 响应链的过程: 当事件发生的时候,响应链首先被发送给第一个响应者(往往是事件发生的视图,也就是用户触摸屏幕的地方).事件将沿着响应者链一直向下传递,知道被接受并作出处理.一般来说,

iOS响应链和传递机制

iOS中加载的时候会先执行main函数 [objc] view plain copy print? int main(int argc, charchar * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } 根据main函数的参数加载UIApplication->AppDelegate->UIWindow->

ios中事件的响应链(Responder chain)和传递链

事件的响应链涉及到的一些概念 UIResponder类,是UIKIT中一个用于处理事件响应的基类.窗又上的所有事件触发,都由该类响应(即事件处理入又).所以,窗又上的View及控制器都是 派生于该类的,例如UIView.UIViewController等. 调用UIResponder类提供的方法或属性,我们就可以捕捉到窗又上的所有响应 事件,并进行处理. 响应者链条是由多个响应者对象连接起来的链条,其中响应者对象是能处理事 件的对象,所有的View和ViewController都是响应者对象,利

iOS学习9_事件分发&响应链&android转iOS的感悟

iOS的三种事件:触摸事件/运动事件/远程控制事件 typedef enum { UIEventTypeTouches, UIEventTypeMotion, UIEventTypeRemoteControl, } UIEventType; 只有继承UIResponder类的对象才能处理事件,如UIView.UIViewController.UIApplication都继承自UIResponder,都能接收并处理事件.UIResponder中定义了上面三类事件相关的处理方法: 下面主要讨论触摸事

iOS开发 - 事件传递响应链

一.序言 当我们在使用微信等工具,点击扫一扫,就能打开二维码扫描视图.在我们点击屏幕的时候,iphone OS获取到了用户进行了"单击"这一行为,操作系统把包含这些点击事件的信息包装成UITouch和UIEvent形式的实例,然后找到当前运行的程序,逐级寻找能够响应这个事件的对象,直到没有响应者响应.这一寻找的过程,被称作事件的响应链,如下图所示,不用的响应者以链式的方式寻找. 事件响应链: 二.响应者 在iOS中,能够响应事件的对象都是UIResponder的子类对象.UIRespo

iOS事件响应链

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); 事件传递之响应链 当你设计App时你可能需要动态的响应事件.例如,一个触摸事件可能发生在屏幕上不同的对象中,你需要决定哪个对象来响应这个给定的事件,理解对象如何接收事件. 当用户触发的一个事件发生,UIKit会创建一个包含要处理的事件信息的事件对象.然后她会将事件对象

iOS开发——响应链(Responder Chain)的深入理解和代码示例

我在之前一篇博客<iOS响应者链Responder Chain浅析>中对iOS开发中遇到的响应者链概念有了基本的了解.但是仅仅停留在理解概念的基础上还是远远不够的.该博客我们会通过代码案例来深入理解响应链.该博客的示例上传至 https://github.com/chenyufeng1991/ResponderChain  . (1)首先来说说第一响应者(First Responder).响应事件的传递过程就是为了找到第一响应者.以下几个方法: isFirstResponder:判断该View

事件处理指南(Event Handling Guide for iOS) 阅读笔记 (二) 响应链

Event Delivery: The Responder Chain 我们希望在我们的app中可以动态的响应触摸事件.比如一个触摸可能会发生在屏幕上不同的位置和不同的组件上, 我们需要判断哪个组件响应这个触摸并且了解这个组件是如何接受到触摸事件的. 当一个用户触摸事件发生了, UIKit会创建一个包含需要被处理的事件信息的对象.然后将这个对象放入当前的事件循环队列中,对于触摸事件,这个对象被创建为 UIEvent 对象,对于移动事件这个对象会依赖于你使用的 Framework和你所关心的移动事

iOS学习9_事件分发&amp;amp;响应链

iOS的三种事件:触摸事件/运动事件/远程控制事件 typedef enum { UIEventTypeTouches, UIEventTypeMotion, UIEventTypeRemoteControl, } UIEventType; 仅仅有继承UIResponder类的对象才干处理事件,如UIView.UIViewController.UIApplication都继承自UIResponder,都能接收并处理事件.UIResponder中定义了上面三类事件相关的处理方法: 以下主要讨论触摸