UI基础:事件.响应链

UIEvent:事件,是由硬件捕捉的一个代表用户操作操作设备的对象.

事件分三类:触摸事件.晃动事件.远程控制事件.

触摸事件:用户通过触摸设备屏幕操作对象,.输入数据.支持多点触摸,包含1个到多个触摸点.

UIView支持触摸事件(继承了UIResponder),而且支持多点触摸

使用时,需要定义UIView子类,重写触摸相关的方法.

1.刚开始触摸到屏幕的时候触发

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

2.触摸事件被意外中断的时候触发(如:来电)

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

3.当手指离开屏幕的时候触发

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

4.当手指在视图上移动的时候触发

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

}

UITouch 点击类

touchs 存放手指对象

如:

1.当单击时
UITouch *touch=[touches anyObject];
//获取手指对象的数组
2.但双击时
NSArray *allTouch=[touches allObjects];
//获取手指对象
UITouch *touch1=[allTouch firstObject];
UITouch *touch2=[allTouch lastObject];


手势:有规律的触摸

UITouch代表触摸在屏幕上的一根手指,可以获取触摸时间和触摸位置.

获取touch对象:touches集合中包含了视图上的所有手势.



响应者链

有多个响应者对象组成的链.

UIResponder 响应者类

iOS中所有能响应事件(触摸.晃动.远程事件)的对象都是响应者.

系统定义了一个抽象的父类UIResponder来表示响应者.其子类都是响应者.

检测触碰视图

硬件检测到触摸操作,会将信息交给UIApplication,开始检测.

检测过程:

UIApplication -> window ->viewController ->view ->检测所有子视图

处理触摸事件:

事件处理的顺序与触摸检测查询相反.(自己的用户交互关闭,就交给父类处理)

触摸的子视图 -> view -> viewController ->window ->UIApplication

阻断响应者链

响应者链可以被打断.无法完成检测查询过程.

视图类的属性:userInteractionEnabled 关闭后可以阻断查询过程

__其中,下面是在事件里面几个简单程序的主要代码段

1.实现点击屏幕一次换颜色.点击两次换父视图的颜色

//当手指离开屏幕的时候触发
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"%s",__FUNCTION__);
    //    UITouch  点击类
    // touchs   存放手指对象
    UITouch *touch=[touches anyObject];
    if (1==touch.tapCount) {
        //        当视图识别为单击,延迟执行之下的方法,看是否会有再次点击
        [self performSelector:@selector(changeMyselfBackGroundColor) withObject:nil afterDelay:0.3];
//        self.backgroundColor=[UIColor randomColor];

    }else if(2==touch.tapCount){
//       当识别为双击的时候,取消之前的操作
        [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(changeMyselfBackGroundColor) object:nil];
        self.superview.backgroundColor=[UIColor randomColor];
    }

}

-(void)changeMyselfBackGroundColor{
    self.backgroundColor=[UIColor randomColor];
}

其中,对UIcolor进行了类目,使其有个随机颜色的功能

@implementation UIColor (Random)
+(UIColor *)randomColor{
    return [UIColor colorWithRed:COLORVALUE green:COLORVALUE blue:COLORVALUE alpha:1.0];

}
@end

2.实现缩放视图的功能

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

    if (1==touches.count) {
        return;
    }else{

        //    获取手指对象的数组
        NSArray *allTouch=[touches allObjects];
        //获取手指对象
        UITouch *touch1=[allTouch firstObject];
        UITouch *touch2=[allTouch lastObject];
        //    获取两个手指的当前位置
        CGPoint currenFirstPoint=[touch1 locationInView:self];
        CGPoint currenSecondPoint=[touch2 locationInView:self];
        //    获得两个手指当前的距离
        CGFloat currentDistance=[self distanFromPoint:currenFirstPoint toPoint:currenSecondPoint];
        //    获取之前两手指的位置
        CGPoint previousFirstPoint=[touch1 previousLocationInView:self];
        CGPoint previousSecondPoint=[touch2 previousLocationInView:self];
        //    获取之前两手指之间的距离
        CGFloat currentsDistance=[self distanFromPoint:previousFirstPoint toPoint:previousSecondPoint];
        //    获取比例
        CGFloat rate=currentDistance/currentsDistance;
        //    缩放视图,中心点不变,修改bounds即可
        self.bounds=CGRectMake(0, 0, self.frame.size.width*rate, self.frame.size.height*rate);

    }

}
//封装计算两点之间的距离的方法
-(CGFloat)distanFromPoint:(CGPoint)fromPoint toPoint:(CGPoint)toPoint{
    CGFloat dx=fromPoint.x-toPoint.x;
    CGFloat dy=fromPoint.y-toPoint.y;
    return sqrt(dx*dx+dy*dy);
}

3.实现视图随着手指移动

@implementation MoveView

//触摸的方法没必要完全实现
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{

    //先获取手指对象
    UITouch *touch=[touches anyObject];
//    获取自身视图手指当前的手指位置
    CGPoint currenPoint=[touch locationInView:self];
//    获取手指之前的位置
    CGPoint perviousPoint=[touch previousLocationInView:self];
//    计算移动的增量
    CGFloat dx=currenPoint.x-perviousPoint.x;
    CGFloat dy=currenPoint.y-perviousPoint.y;

    CGPoint center=self.center;
    self.center=CGPointMake(center.x+dx, center.y+dy);

}
@end

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 07:00:26

UI基础:事件.响应链的相关文章

iOS事件响应链

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

事件响应链

事件响应链的过程:第一响应者--->superview--->viewCtrl--->UIWIndow--->UIApplation--->Appdelegate,事件从下向上传递,如果一环不处理,则传递到下一环,如果都没有处理,最后回到UIApplication,再不处理就会抛弃. 我们计算第一响应者的过程是要通过以下步骤:即事件分发反的过程.iOS系统--->UIApplation-->UIWindow-->viewCtrl-->superView

Linux内核基础--事件通知链(notifier chain)

转载: http://blog.csdn.net/wuhzossibility/article/details/8079025 http://blog.chinaunix.net/uid-27717694-id-4286337.html 内核通知链 1.1. 概述 Linux内核中各个子系统相互依赖,当其中某个子系统状态发生改变时,就必须使用一定的机制告知使用其服务的其他子系统,以便其他子系统采取相应的措施.为满足这样的需求,内核实现了事件通知链机制(notificationchain). 通知

什么是事件响应链

对于IOS设备用户来说,他们操作设备的方式主要有三种:触摸屏幕.晃动设备.通过遥控设施控制设备.对应的事件类型有以下三种: 触屏事件(Touch Event) 运动事件(Motion Event) 远端控制事件(Remote-Control Event) 响应者链(Responder Chain) 响应者对象(Responder Object),指的是有响应和处理事件能力的对象.响应者链就是由一系列的响应者对象构成的一个层次结构. UIResponder是所有响应对象的基类,在UIRespond

Linux内核基础--事件通知链(notifier chain)【转】

转自:http://blog.csdn.net/wuhzossibility/article/details/8079025 内核通知链 1.1. 概述 Linux内核中各个子系统相互依赖,当其中某个子系统状态发生改变时,就必须使用一定的机制告知使用其服务的其他子系统,以便其他子系统采取相应的措施.为满足这样的需求,内核实现了事件通知链机制(notificationchain). 通知链只能用在各个子系统之间,而不能在内核和用户空间进行事件的通知.组成内核的核心系统代码均位于kernel目录下,

Jquery | 基础 | 事件的链式写法

$(".title").click(function () { $(this).addClass("curcol").next(".content").css("display", "block"); }); <!DOCTYPE html> <html> <head> <title>jQuery事件的链式写法</title> <script

解释为什么imgView要打开点击事件【事件响应链】

(1)在AppDelegate.m文件中将导航控制器设置为根控制器 RootViewController *rootCtrl = [[RootViewController alloc] init]; UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:rootCtrl]; self.window.rootViewController = navCtrl; (2)添

iOS开发 - 事件传递响应链

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

事件传递之响应链(Event Delivery: The Responder Chain)【转】

当你设计App时你可能需要动态的响应事件.例如,一个触摸事件可能发生在屏幕上不同的对象中,你需要决定哪个对象来响应这个给定的事件,理解对象如何接收事件. 当用户触发的一个事件发生,UIKit会创建一个包含要处理的事件信息的事件对象.然后她会将事件对象放入active app’s(应用程序对象,每个程序对应唯一一个)事件队列.对于触摸事件,事件对象就是UIevent对象封装的一系列触摸集合.对于动作事件,这个事件对象依赖于使用的framework和你关心哪种动作事件. 事件通过特殊的路径传递直到被