触控事件的学习笔记(待修稿)

iOS的触控事件是基于多点触控模型。



一、触控可以概述为:

1.触控是用户手指触碰屏幕,或触碰屏幕并在屏幕上移动时,系统不间断发送给应用程序的“对象”。

2.系统把事件按照特定的路径传递给可以处理事件的“对象”。

3.在iOS中,一个触摸表示一个UITouch对象;一个UITouch对象表示一个事件。

4.事件的对象包含与当前多点触摸序列对应的所有触摸对象,也可以提供和特定视图(或窗口)关联的触摸事件。



二、触控的开始、移动和结束:

触摸信息有时间和空间两项。

1.时间上的信息称为阶段(有四个阶段)

(1)触摸是否开始、(2)是否移动中、(3)停止中、(4)停止的时刻。

2.触摸信息中也包括当前视图的位置信息,在窗口中的的位置信息。

3.手指接触屏幕时,触摸会和某个窗口(或视图)关联,这个关联在事件的生命周期都回得到维护。


触控有关的术语:

1.“手势” 手指接触屏幕开始,直到手指离开屏幕为止发生的所有事件;

2.“触摸” 手指放到屏幕上拖动。

3.“轻击” 手指触摸屏幕,并立即离开的动作。


三、Cocoa中,代表触摸的对象的类是UITouch。

UITouch类中包含5个属性:

1.window:触摸产生所在的窗口。(窗口可变,所以不一定是最开始是的窗口)

2.view:触摸产生时所在的视图。(视图可变,所以不一定是最开始是的视图)

3.tapCount:轻击(Tap)操作和鼠标单击操作一样。(TapCount表示短时间内轻击屏幕的次数)

4.timestamp:时间戳用来记录触摸事件产生和变化的时间。(单位秒)

5.phase:触摸事件在屏幕上的周期。(触摸开始、触摸移动、中途取消、触摸结束)


phase UITouchPhase类型的,是一个枚举:

(1)UITouchPhaseBegan:触摸开始;

(2)UITouchPhaseMove:接触点移动;

(3)UITouchPhaseStationary:接触点无移动;

(4)UITouchPhaseEnded:触摸结束

(5)UITouchPhaseCancelled:触摸取消


四、触控事件的响应链

UIResponder 响应者:

-所有的事件响应的类都是UIResponder的子类。

(即UIResponder是所有事件响应的基类,并为所有响应事件进行处理,和提供通用的响应行为处理。)

-UIView及所有所有作为UIview子类的UIKit类(包括Window)都直接或间接的继承UIResponser

(所有这些类的实例都是响应对象)

-在iOS中,一个UIResponder对象表示一个可以接受触摸屏上触摸事件的对象。(既一个可以接收事件的对象)

-响应者,可以响应三种类型的事件:1.触控事件;2.motion事件;3.remove事件。

-Responser提供的四个响应触控事件的方法,这个四个方法是触摸事件捕捉的核心。

(这些方法都接收两个参数,一个NSSet,一个UIEvent)


-UIEvent对象包含一组相关的UITouch对象。

(可以理解为一个完整的的触摸操作是一个UIEvent,完整的操作就是UITouch包括(按下,移动,离开))

-UIEvent的作用的作用就是提供触摸事件的相关操作列表。

(可以使用该对象来获取在屏幕上的操作手势,这些操作都存储在Foundation框架中的NSSet对象中。)


-NSSet存放的是UITouch对象。

(UITouch对象是手指接触屏幕做移动(或离开屏幕)时创建)

lacationInView:此方法可以触摸在指定视图中的当前位置

previousLocationView:此方法可以触摸在指定视图中的前一个位置。

NSSet主要的时间控制方法是在给定的触摸阶段中。发生新的触摸动作或已有的触摸动作发生变化,应用程序会发送消息:

=手指触碰屏幕时,发送touchesBegan:withEvent:消息;

=手指在屏幕上移动,发送tochesMoved:withEvent:消息;

=手指离开屏幕时,发送touchsEnded:withEvent:消息

=当触摸序列被取消(如电话呼入),发送touchesCancelled:withEvent:消息


触控事件的响应链:

控件响应触碰时间的时候,有先后的顺序。有一个第一响应者(即受到触控事件时,会第一个响应触控事件的控件,这个响应者一般都是用户正在交互的对象)

响应链:

响应链就是一系列已经连接的响应者对象。(事件和消息通过连接的路径进行传递)


诺干响应者链接的响应链中,如果第一响应者(或视图)不处理消息,UIkit会通过消息的形式把事件转发到第一响应者的下一个响应者,此时再看这个第二响应者是处理这个消息,如果不处理接着传递。(在响应链中,允许响应者把事件处理的责任传递给高层的其他响应者)

响应链要有一系列的下一个响应者,每个下一个响应者可以通过nextResponser方法来得到。


响应链的规则

1.第一响应者就是响应链的开始

2.以UIResponder为父类的任何类都是响应者

3.如果第一响应者不处理某事件,则这个事件会传递给响应者链中的下一级,如果下一级处理,就停止事件的传递。

4.如果事件通过整个响应者链后,并且没有对象处理这个事件,那么这个事件会被丢弃。


在iOS中,由响应链来对事件进行响应,所有事件的响应的类都是UIResponder的子类。因为响应者链是一个不同对象组成的层级结构,所以每个对象都会以此获得响应事件消息的机会。(直到事件被处理才会停止)


响应链传递顺序的总结:

1.第一响应者几乎总是视图或控件,并且首先对事件进行响应;

2.如果第一响应者不处理,便传递给自身的视图控制器,如果仍不处理变传递给第一响应者的父视图;

3.如果父视图没有处理,便转到父视图的控制器;

4.如果一直传递,任何链节都没有处理,最终会传递到应用程序的窗口;

5.如果窗口不处理,便会传递给应用程序委托,如果应用程序委托不是UIResponder子类(或不处理),最终这个事件会被丢弃。


响应链中传递触控事件的方法

利用响应者的父类UIResponder提供的四个方法,实现将事件传递给下一个传递者。

[self.nextResponder touchesBegan:touches withEvent:event];

步奏:

1.首先定义一个视图,并实现UIResponder提供的四个方法中的其中一个;

2.在里面先简单的打印本视图的名字,然后再将触控事件传递给下一个响应者;

3.最后在视图控制器中创建三个视图,并让这三个视图重叠在一起,点击按钮,通过控制台来观察触控事件的传递顺序。


步奏1.新创建一个Cocoa Touch类,用来创建视图

得到新创建的类的文件(自定义视图类文件)

步奏2.在MyView.h文件中添加一个字符串(自定义视图h文件)

#import

@interfaceMyView :UIView

@property(retain,nonatomic)NSString*name;//添加一个的全局字符串变量name

@end

步奏3.在MyView.m文件中添加代码(自定义视图m文件)

#import"MyView.h"

@implementationMyView

/**

*创建视图

*/

-(id)initWithFrame:(CGRect)frame//初始化器

{

self= [superinitWithFrame:frame];

if(self)

{

}

returnself;

}

/**

*响应触摸事件的代码

*/

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

{

NSLog(@"%@",self.name);//输出方法

[self.nextRespondertouchesBegan:toucheswithEvent:event];

}

@end

步奏4.在ViewController.h文件中添加方法名(视图控制器h文件)

#import

#import"MyView.h"

@interfaceViewController :UIViewController

@property(retain,nonatomic)MyView* view1;

@property(retain,nonatomic)MyView* view2;

@property(retain,nonatomic)MyView* view3;

@end

步奏5.在ViewController.m文件中实现具体操作(视图控制器m文件)

#import"ViewController.h"

@interfaceViewController()

@end

@implementationViewController

- (void)viewDidLoad

{

//添加第一个红色视图

[superviewDidLoad];

self.view1=[[MyViewalloc]initWithFrame:CGRectMake(20,50,280,280)];

self.view1.backgroundColor= [UIColorredColor];

//添加第二个绿色视图

self.view2=[[MyViewalloc]initWithFrame:CGRectMake(40,40,200,200)];

self.view2.backgroundColor= [UIColorgreenColor];

//添加第三个蓝色视图

self.view3=[[MyViewalloc]initWithFrame:CGRectMake(40,40,120,120)];

self.view3.backgroundColor= [UIColorblueColor];

//三个视图输出的内容

self.view1.name=@"红视图,编号1,位于底部";

self.view2.name=@"绿视图,编号2,位于中部";

self.view3.name=@"蓝视图,编号3,位于底部";

//添加视图到本视图中

[self.view2addSubview:self.view3];

[self.view1addSubview:self.view2];

[self.viewaddSubview:self.view1];

}

- (void)didReceiveMemoryWarning

{

[superdidReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 在iOS开发中经常会涉及到触摸事件。本想自己总结一下,但是遇到了这篇文章,感觉总结的已经很到位,特此转载。作者:L...
    WQ_UESTC阅读 5,987评论 4 26
  • 好奇触摸事件是如何从屏幕转移到APP内的?困惑于Cell怎么突然不能点击了?纠结于如何实现这个奇葩响应需求?亦或是...
    Lotheve阅读 56,585评论 51 597
  • 史上最详细的iOS之事件的传递和响应机制-原理篇http://www.jianshu.com/p/2e074db7...
    Chris_C阅读 1,414评论 0 8
  • iOS开发中的事件处理 理论非原创,是对网上资料的整理以及Demo验证 一. UIResponder 1.1 事件...
    丧心病狂乐阅读 658评论 0 0
  • 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件。我们称之...
    JonesCxy阅读 685评论 0 0