关于iOS事件处理

1.UIResponser

UIResponser是iOS中用来处理用户事件的API,不仅可以接收事件还可以响应和传递事件,如果当前响应者不能处理,就转发给其它响应者处理。

2.什么是响应者

响应者顾名思义就是响应事件的对象,所有UIResponder的子类都可以作为响应者去响应事件,比如UIView、UIViewController、UIApplication等。

3.什么是第一响应者

⚠️:第一响应者并不一定就是真正响应事件的对象!

当事件到来时,系统会将事件传递给合适的响应者,并且将其成为第一响应者,第一响应者未处理的事件将会在响应链中传递,传递规则由UIResponder的nextResponder决定,可以通过重写该属性来决定传递规则。当一个事件到来时,第一响应者没有接收消息,则顺着响应者链向后传递。

4.如何查找第一响应者

查找第一响应者的方法:

返回被点击的视图

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;

上面这个方法会调用下面这个方法判断点击区域是不是在视图上。

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

第一响应者其实就是在点击区域并且处于最上层的视图。这个过程其实就是在获取点击屏幕的时候具体点击了那一块区域,但是点击了这一块区域并不代表这一块区域就会执行点击事件。

查找第一响应者的过程:从keyWindow开始,逐级遍历子视图,调用hitTest:withEvent:方法,判断子视图在不在点击区域,如果子视图不在点击区域或者没有子视图,那么当前视图就是第一响应者。

如果点击事件发生在视图外,但是在子视图内,那么子视图也不能成为第一响应者,因为在查找子视图的父视图的时候就已经断了。

在遍历视图时,忽略以下三种情况的视图:

视图的hidden等于YES。

视图的alpha小于等于0.01。

视图的userInteractionEnabled为NO。

查找第一响应者的过程中,就创造了一个响应者链。查找第一响应者的过程也就是创造响应者链的过程是从父类到子类一个从上到下的过程。但是这个链的方向是从下到上的,也就是从子类指向父类。

5.事件传递

事件传递的过程是一个从子类到父类,从下到上的过程。

事件到来的时候,会先传递给第一响应者,如果第一响应者不能处理就沿着响应者链向他的父视图传递,父视图会把事件传递给UIViewCotroller的view,view传递给他的控制器,控制器传递给UIWindow,UIWindow传递给UIApplication,最后传递到了UIApplicationDelegate,如果不能处理就把这个事件丢弃。

6.事件拦截

有些时候,我们可能不希望让视图的子视图去处理事件,而是想直接让该视图去处理事件。那么我们就可以重写hitTest:withEvent:方法。让当前视图成为响应者链的末端。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    return self;

}

7.扩大事件响应区域

有些时候,子视图的区域可能超过了父视图的区域,这个时候点击子视图在父视图外面的那部分区域就没办法响应到,这个时候可以重写父视图的hitTest:withEvent:方法,扩大点击区域。

8.手势

⚠️:手势和点击事件是不一样的,手势是一个gesture,点击事件是一个UITouch。如果同时添加了点击事件和手势,那么手势优先执行,这是因为手势的执行优先级是高于响应者链的。

9.响应事件的逻辑

当事件到来时,会通过hitTest和pointInside两个方法,从Window开始向上面的视图查找,找到第一响应者的视图。找到第一响应者后,系统会判断其是继承自UIControl还是UIResponder,如果是继承自UIControl,则直接通过UIApplication直接向其派发消息,并且不再向响应者链派发消息。

如果是继承自UIResponder的类,则调用第一响应者的touchesBegin,并且不会立即执行touchesEnded,而是调用之后顺着响应者链向后查找。如果在查找过程中,发现响应者链中有的视图添加了手势,则进入手势的代理方法中,如果代理方法返回可以响应这个事件,则将第一响应者的事件取消,并调用其touchesCanceled方法,然后由手势来响应事件。

如果手势不能处理事件,则交给第一响应者来处理。如果第一响应者也不能响应事件,则顺着响应者链继续向后查找,直到找到能够处理事件的UIResponder对象。如果找到UIApplication还没有对象响应事件的话,则将这次事件丢弃。

参考:iOS事件处理,看我就够了~

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

推荐阅读更多精彩内容