响应者链

响应者链即一系列响应者对象组成的层次结构。

理解响应者链需要理清的两个概念(仅以触屏事件Touch Event为例):

1.First Responder,当前接受触摸的响应者对象,通常是一个UIView对象,作为响应者链的开端。整个响应者链和事件分发的使命就是找出First Responder。

2.hit-test view,为找出First Responder,系统从上到下(UIWindow->lowest view)检测响应者对象的过程。

具体的检测流程如下:

UIWindow实例对象会首先在它的内容视图上调用hitTest:withEvent:,此方法会在其视图层级结构的每个视图上调用pointInside:withEvent:(该方法用来判断点击事件发生的位置是否处于当前视图范围内,以确定用户是不是点击了当前视图),如果pointInside:withEvent:返回YES,则继续逐级调用,直到找到touch操作发生的位置,这个视图就是要找的hit-test view。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 返回在层级上离当前view最远(离用户最近)且包含指定的point的view。

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 返回boolean值指出receiver是否包含指定的point。

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    for (UIView *view in self.subviews) {
        if (!view.hidden && view.userInteractionEnabled && [view pointInside:[self convertPoint:point toView:view] withEvent:event])
            return YES;
    }
    return NO;
}

说明:

1.如果最终hit-test没有找到First Responder,或者First Responder没有处理该事件,则该事件会沿着响应者链向上回溯,如果UIWindow实例和UIApplication实例都不能处理该事件,则该事件被丢弃。

2.hitTest:withEvent:方法会忽略隐藏(hidden=YES)的视图,禁止用户操作(userInteractionEnabled=YES)的视图,以及alpha级别小于0.01(alpha<0.01)的视图。

3.可以重写hitTest:withEvent:方法,以达到某些特殊目的,如子视图区域超出父视图的检测(父视图的clipToBounds属性为NO)。

时间: 2024-08-24 19:52:26

响应者链的相关文章

事件分发与响应者链

在iOS中事件分为三类: 触摸事件:通过触摸.手势进行触发(点击,缩放等) 运动事件:通过加速器进行触发(微信摇一摇等) 远程控制事件:通过其他远程设备触发(线控耳机) 只有继承自UIResponder的类才能处理事件 下面说一下触摸事件 当用户触摸屏幕时,事件会被封装成一个event实例,包含了触摸相关信息,然后操作系统对其进行分发,由响应者类进行处理(UIResponder的子类); 简单的分发与响应过程图: 1.事件的分发 iOS系统检测到手指触摸(Touch)操作时会将其放入当前活动Ap

Cocoa Touch事件处理流程--响应者链

Cocoa Touch事件处理流程--响应者链 一.事件分类 对于IOS设备用户来说,他们操作设备的方式主要有三种:触摸屏幕.晃动设备.通过遥控设施控制设备.对应的事件类型有以下三种: 1.触屏事件(Touch Event) 2.运动事件(Motion Event) 3.远端控制事件(Remote-Control Event) 今天以触屏事件(Touch Event)为例,来说明在Cocoa Touch框架中,事件的处理流程.首先不得不先介绍响应者链这个概念: 二.响应者链(Responder

iOS响应者链

首先,当发生事件响应时,必须知道由谁来响应事件.在IOS中,由响应者链来对事件进行响应,所有事件响应的类都是UIResponder的子类,响应者链是一个由不同对象组成的层次结构,其中的每个对象将依次获得响应事件消息的机会.当发生事件时,事件首先被发送给第一响应者,第一响应者往往是事件发生的视图,也就是用户触摸屏幕的地方.事件将沿着响应者链一直向下传递,直到被接受并做出处理.一般来说,第一响应者是个视图对象或者其子类对象,当其被触摸后事件被交由它处理,如果它不处理,事件就会被传递给它的视图控制器对

Responder一点也不神秘————iOS用户响应者链完全剖析

http://blog.csdn.net/mobanchengshuang/article/details/11858217?utm_source=tuicool&utm_medium=referral 这篇文章想跟大家分享的主旨是iOS捕获用户事件的各种情况,以及内部封装的一些特殊事件. 我们先从UIButton谈起,UIButton大家使用的太多了,他特殊的地方就在于其内置的普通Default/高亮Highlighted/选择Selected/可用Enable的几个状态(UIControlS

触摸 响应者链

触摸 响应者链     事件: 由硬件捕获到用户的一个操作     iOS的事件: 触摸时间, 晃动事件, 远程控制事件     触摸事件: 支持多点触摸, 最多支持11个点, 6s以后的设备支持压感识别     如何捕获用户的触摸事件?     1.用户能够触摸的都是UIView或UIView的子类     2.创建一个UIView的子类     3.重写UIView的几个方法 和触摸相关的方法 一次触摸包含: 一次开始, 一次结束, 多次移动 - (void)touchesBegan:(NS

IOS中的响应者链

响应者链就是当子视图不响应,父视图有响应事件,父视图响应 #import "RootViewController.h" #import "ResponderView.h" @interface RootViewController () @end @implementation RootViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after

触摸事件,响应者链和手势

1.触摸事件 1 #import "ViewController.h" 2 @interface ViewController () 3 @property (strong,nonatomic) UILabel *simple; 4 @end 5 6 @implementation ViewController 7 8 - (void)viewDidLoad { 9 [super viewDidLoad]; 10 // Do any additional setup after loa

《从零开始学Swift》学习笔记(Day 68)——Cocoa Touch设计模式及应用之响应者链与触摸事件

原创文章,欢迎转载.转载请注明:关东升的博客 应用与用户进行交互,依赖于各种各样的事件.事件响应者对象是可以响应事件并对其进行处理的对象,响应者链是由一系列链接在一起的响应者组成的.响应者链在事件处理中是非常重要的,响应者链可以把用户事件路由给正确的对象. 响应者对象与响应链 UIResponder是所有响应者对象的基类,它不仅为事件处理,而且也为常见的响应者行为定义编程接口.UIApplication.UIView(及其子类,包括UIWindow)和UIViewController(及其子类)

IOS开发中响应者链

在IOS开发中,有时候会遇到如下情况:在页面1上有一个RedView,在RedView上有一个GreenView,在GreenView上有一个button,这些view的创建代码如下: 1.AppDelegate.m 1 // 2 // AppDelegate.m 3 // 响应者链 4 // 5 // Created by mac on 16/5/10. 6 // Copyright © 2016年 mzw. All rights reserved. 7 // 8 9 #import "App