IOS中的响应者链

响应者链就是当子视图不响应,父视图有响应事件,父视图响应

#import "RootViewController.h"
#import "ResponderView.h"
@interface RootViewController ()

@end

@implementation RootViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    ResponderView *viewTop = [[ResponderView alloc] initWithFrame:CGRectMake(0, 0, 320, 284)];
    viewTop.tag = 100;
    viewTop.backgroundColor = [UIColor redColor];
    [self.view addSubview:viewTop];
    [viewTop release];
    ResponderView *viewDow = [[ResponderView alloc] initWithFrame:CGRectMake(0, 284, 320, 284)];
    viewDow.tag = 101;
    viewDow.userInteractionEnabled = NO;
    viewDow.backgroundColor = [UIColor yellowColor];

    [self.view addSubview:viewDow];
    [viewDow release];

    ResponderView *viewNe1 = [[ResponderView alloc] initWithFrame:CGRectMake(40, 40, 240, 204)];
    viewNe1.tag = 102;
    viewNe1.backgroundColor = [UIColor greenColor];

    [viewDow addSubview:viewNe1];
    [viewNe1 release];

    ResponderView *viewNe2 = [[ResponderView alloc] initWithFrame:CGRectMake(40, 40, 160, 124)];
    viewNe2.tag = 103;
    viewNe2.backgroundColor = [UIColor blueColor];
    [viewNe1 addSubview:viewNe2];
    [viewNe2 release];

    UILabel *lab = [[UILabel alloc] initWithFrame:CGRectMake(20, 50, 100, 100)];
    lab.backgroundColor = [UIColor greenColor];
   // lab.userInteractionEnabled = NO;
    lab.tag = 104;
    [viewTop addSubview:lab];
    [lab release];

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
   // btn.backgroundColor = [UIColor blueColor];
    btn.frame = CGRectMake(0, 0, 50,50);
    btn.tag = 105;
    //btn.userInteractionEnabled = NO;
    [btn setTitle:@"按钮" forState:UIControlStateNormal];
    [lab addSubview:btn];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"我是视图控制器 我响应!");
}
@end
#import "ResponderView.h"

@implementation ResponderView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    switch (self.tag) {
        case 100:
            NSLog(@"红色视图");
            break;
        case 101:
             NSLog(@"黄色视图");
            break;
        case 102:
             NSLog(@"绿色视图");
            break;
        case 103:
             NSLog(@"蓝色视图");
            break;
        case 104:
            NSLog(@"fdsf视图");
            break;
        case 105:
            NSLog(@"fdsfddddd视图");
            break;
        default:
            break;
    }
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{

}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{

}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{

}

@end
时间: 2024-08-25 23:04:23

IOS中的响应者链的相关文章

iOS Responder Chain 响应者链

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

iOS 的事件处理 响应者链

ios的事件处理时从硬件开始,由驱动传递给系统层面,再传递给应用程序本身(UIApplication),然后会根据响应链找到所谓的firstResponsder,如果它不 进行处理,然后就传递给响应链下一级响应者,直到回到UIApplication(如果响应链上没有响应),由UIApplication进行默认处理. 在代码可控区域内,ios的屏幕点击事件是从上到下(firstResponsder沿着响应联到window再到app本身)的,所以如果点击所在的点不在某个view的区域内,这个view

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 事件响应者链的学习(也有叫 UI连锁链)

当发生事件响应的时候,必须知道由谁来响应事件.在iOS中,由响应链来对事件进行响应,所有的事件响应的类都是继承于UIResponder的子类,响应链是一个由不同对象组成的层次结构,其中每个对象将依次获得响应事件消息的机会 发生触摸事件后,系统将事件假如到由UIApplication管理的事件 队列  好处:遵循第一响应原则,总会优先处理队列中排在最前面的事件.(栈是先进后出 不符合业务逻辑) (1)事件传递(链) 1.传递链中时没有controller的,因为controller本身不具有大小的

IOS中AutoLayout的使用

1.基本概念 在 iPad 和 iPhone 5 出现之前,iOS 设备就只有一种尺寸.我们在做屏幕适配时需要考虑的仅仅有设备方向而已.而很多应用并不支持转向,这样的话就完全没有屏幕适配的工作了.随着 iPad 和 iPhone 5,以及接下来的 iPhone 6 的推出,屏幕尺寸也变成了需要考虑的对象.在 iOS 7 之前,为一个应用,特别是 universal 的应用制作 UI 时,我们总会首先想我们的目标设备的长宽各是多少,方向变换以后布局又应该怎么改变,然后进行布局.iOS 6 引入了

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

iOS中的事件传递和响应者链

首先我们来看看iOS中事件的产生和传递过程: 1.发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的队列事件中 2.UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常会先发送事件给应用程序的主窗口(keyWindow) 3.主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件 4.找到合适的视图控件后,就会调用视图控件的touches方法来作事件的具体处理:touchesBegin... touchesMoved...touch

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

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

iOS响应者链

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