触摸 响应者链

触摸 响应者链

    事件: 由硬件捕获到用户的一个操作

    iOS的事件: 触摸时间, 晃动事件, 远程控制事件

    触摸事件: 支持多点触摸, 最多支持11个点, 6s以后的设备支持压感识别

    如何捕获用户的触摸事件?

    1.用户能够触摸的都是UIViewUIView的子类

    2.创建一个UIView的子类

    3.重写UIView的几个方法

和触摸相关的方法

一次触摸包含: 一次开始, 一次结束, 多次移动

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"开始触摸");
    随机位置
   self.center = CGPointMake(arc4random() % 176 + 100, arc4random() % 468 + 100);
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"触摸移动");
   self.transform = CGAffineTransformRotate(self.transform, M_PI_4);
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"结束触摸");

    变大
    bounds修改, center不变, 以中点扩大或缩小
    center修改, bounds不变
    CGRect rect = self.bounds;
    rect.size.width *= 1.1;
    rect.size.height *= 1.1;
    self.bounds = rect;

    旋转
    参数1: 原本视图的变形参数
    参数2: 改变的弧度
    self.transform = CGAffineTransformRotate(self.transform, M_PI_4);

}
当触摸时, 出现异常情况(比如来电话), 会阻断触摸的执行, 就是调用能触摸取消这个方法
触摸取消这个方法多用于异常情况
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"取消触摸");
}
@end
main.m
   TouchView *touchView = [[TouchView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
    touchView.center = self.view.center;
    touchView.backgroundColor = [UIColor colorWithRed:0.916 green:0.713 blue:1.000 alpha:1.000];
    [self.view addSubview:touchView];
    [touchView release];
    DragView *dragView = [[DragView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    dragView.backgroundColor = [UIColor cyanColor];
    [self.view addSubview:dragView];
    [dragView release];
DragView.m
#import "DragView.h"
@interface DragView () {
    CGPoint startPoint;
}
@end

@implementation DragView
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    touches: 存放触摸点的集合, 集合的元素类型UITouch
        NSLog(@"%@", touches);
    UITouch: 触摸类, 用于存放触摸点的信息(视图, 位置, 窗口, 点击次数,  点击状态), 继承于NSObject
    UITouch *touch =  [touches anyObject];
    点击次数
    NSLog(@"%lu", touch.tapCount);
    时间戳(距离系统开机的秒数)
    NSLog(@"%.lf", touch.timestamp);
    触摸点在某个视图上的位置
    CGPoint startPonit = [touch locationInView:self.superview];
    NSLog(@"%@", NSStringFromCGPoint(startPonit));
    触摸状态: 开始, 移动, 停止, 结束, 取消
    NSLog(@"%ld", touch.phase);
    触摸的压感
     NSLog(@"%.2lf", touch.maximumPossibleForce);
    event: 事件
    UIEvent, 事件类, 继承于NSObject, 存储事件相关信息
    NSLog(@"%@", event);
    事件类型
    NSLog(@"%ld", event.type);
    获取某个触摸点
    UITouch *touch = [touches anyObject];
    给定坐标系, 获取触摸点的位置
    startPoint = [touch locationInView:self.superview];
    NSLog(@"startPoint: %@", NSStringFromCGPoint(startPoint));

}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint endPoint = [touch locationInView:self.superview];
    NSLog(@"endPoint: %@",NSStringFromCGPoint(endPoint));
    //随鼠标移动
    CGPoint point = self.center;
    point.x += endPoint.x - startPoint.x;
    point.y += endPoint.y - startPoint.y;
    self.center = point;

    startPoint = endPoint;

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

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

}
@end

 响应者链: 多个响应者组成

    UIResponder, 响应者类

    查找触摸了哪个响应者(范围从大到小)

    1.UIApplication, 应用类

    2.window

    3.UIViewController

    4.view

    5.view的子视图

    : 查找的过程组装响应者链

     处理触摸事件(范围从小到大)

    第一个能够处理响应事件者, 叫第一响应者

RootViewController.m

#import "RootViewController.h"
#import "TouchView.h"
#import "DragView.h"
@interface RootViewController ()<UITextFieldDelegate> {
    UITextField *textField;
    UITextField *passwordField;
}
@end
@implementation RootViewController
- (void)viewDidLoad {
   textField = [[UITextField alloc] initWithFrame:CGRectMake(100, 100, 375 - 200, 40)];
    textField.borderStyle = UITextBorderStyleRoundedRect;
    textField.placeholder = @" 请输入用户名";
    textField.returnKeyType = UIReturnKeyNext;
    textField.delegate = self;
    [self.view addSubview:textField];
    [textField release];

    passwordField = [[UITextField alloc] initWithFrame:CGRectMake(100, 160, 375 - 200, 40)];
    passwordField.borderStyle = UITextBorderStyleRoundedRect;
    passwordField.placeholder = @" 请输入密码";
    passwordField.returnKeyType = UIReturnKeyDone;
    passwordField.delegate = self;
    [self.view addSubview:passwordField];
    [passwordField release];

    UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
    button.frame = CGRectMake(140, 220, 375 - 280, 40);
    button.titleLabel.font = [UIFont systemFontOfSize:20];
    button.backgroundColor = [UIColor colorWithRed:0.233 green:1.000 blue:0.059 alpha:1.000];
    [button setTitle:@"按钮" forState:UIControlStateNormal];
    [button setTintColor:[UIColor whiteColor]];
    [self.view addSubview:button];
    [button addTarget:self action:@selector(press) forControlEvents:UIControlEventTouchUpInside];

    让textField成为第一响应者
    [textField becomeFirstResponder];

    UIView *bgView = [[UIView alloc] initWithFrame:CGRectMake(100, 300, 100, 100)];
    bgView.backgroundColor = [UIColor cyanColor];

    userInteractionEnabled, 是否开启用户交互, 如果设置为NO, 阻断响应者链的执行
    Bug: 超出父视图范围是无法被点击的

    将userInteractionEnabled默认为NO的类
    1.UILabel
    2.UIImageView
    bgView.userInteractionEnabled = NO;
    [self.view addSubview:bgView];
    [bgView release];

    UITextField *textField2 = [[UITextField alloc] initWithFrame:CGRectMake(10, 50, 80, 40)];
    textField2.borderStyle = UITextBorderStyleRoundedRect;
    [bgView addSubview:textField2];
    [textField2 release];
}

- (void)press {
    NSLog(@"press");
    让textField注销第一响应者
    [textField resignFirstResponder];
    [passwordField resignFirstResponder];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField *)textField1 {
    if (textField1 == passwordField) {
        [passwordField resignFirstResponder];
    } else {
    [passwordField becomeFirstResponder];
    }
    return YES;
}
@end

                                                        2015-10-20 20:20:37

 

时间: 2024-12-18 03:04:15

触摸 响应者链的相关文章

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

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(及其子类)

UI-事件,触摸与响应者链(一)

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

事件分发与响应者链

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

响应者链

响应者链即一系列响应者对象组成的层次结构. 理解响应者链需要理清的两个概念(仅以触屏事件Touch Event为例): 1.First Responder,当前接受触摸的响应者对象,通常是一个UIView对象,作为响应者链的开端.整个响应者链和事件分发的使命就是找出First Responder. 2.hit-test view,为找出First Responder,系统从上到下(UIWindow->lowest view)检测响应者对象的过程. 具体的检测流程如下: UIWindow实例对象会

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本身不具有大小的