UIResponder

响应链的构成

app中,视图都是按照树状结构组织起来的,构成树状结构的同时也构成了响应链。

找到第一响应者的过程

用户触发某一事件后,UIKIt生成一个UIEvent对象,该对象包含一些处理事件所需信息。处理事件时,UIApplication对象把事件分发给window对象,window对象分发给事件发生的VC视图上,视图按照触摸的位置递归检测其所有子视图,包含触摸点的最底层视图就是hit-testing视图。系统将事件发送给这个视图处理,然后就是视图响应链的过程

响应链的响应过程

1.触发了一个事件,app首先按照树状结构找到第一响应者(通过hit-test方式)
2.如果第一响应者不能处理事件,传递给他的父视图,一直循环到viewController
3.如果viewController无法处理,传递给window对象
4.如果window对象无法处理,传递给UIApplication对象处理,如果还是无法处理,丢弃事件

如果父视图有如上设置
view.hidden=YES;
view.alpha = 0.0f;
view.userInteractionEnabled = NO;
则子视图不能接受触摸事件,包括拦截操作

拦截响应者链

需要拦截响应者对象的View重写

  • (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event;方法
    方法1,返回需要响应的视图(推荐)
    方法2,返回自己,但是因为寻找响应者的过程是后添加的视图先检查,所以有可能没遍历到自己就找到了真正响应的view,拦截失败

管理响应者链

Returns the next responder in the responder chain, or nil
if there is no next responder.
The UIResponder
class does not store or set the next responder automatically, so this method returns nil
by default. Subclasses must override this method and return an appropriate next responder. For example, UIView
implements this method and returns the UIViewController object that manages it (if it has one) or its superview (if it doesn’t). UIViewController similarly implements the method and returns its view’s superview. UIWindow
returns the application object. UIApplication
returns nil
Returns
The next object in the responder chain or nil
if this is the last object in the chain.

  • (nullable UIResponder*)nextResponder;

//Tells this object when a physical button is first pressed.
UIKit calls this method when a new button is pressed by the user. Use this method to determine which button was pressed and to take any needed actions.
The default implementation of this method forwards the message up the responder chain. When creating your own subclasses, call super
to forward any events that you do not handle yourself.

Parameters
presses
A set of UIPress instances that represent the new presses that occurred. The phase of each press is set to UIPressPhaseBegan.
event
The event to which the presses belong.
//物理设备回调,UIPress对象告诉你哪个按钮被按了

  • (void)pressesBegan:(NSSet<UIPress *> *)presses withEvent:(nullable UIPressesEvent *)event ;

//接收到远程设备命令时调用,为了允许分发远程控制事件,我们必须调用UIApplication的beginReceivingRemoteControlEvents方法;而如果要关闭远程控制事件的分发,则调用endReceivingRemoteControlEvents方法。

  • (void)remoteControlReceivedWithEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(4_0);

//验证命令,启用或禁用指定的命令

  • (BOOL)canPerformAction:(SEL)action withSender:(id)sender

//

  • (nullable id)targetForAction:(SEL)action withSender:(nullable id)sender

输入视图

@property (nullable, nonatomic, readonly, strong) __kindof UIView *inputView NS_AVAILABLE_IOS(3_2);
@property (nullable, nonatomic, readonly, strong) __kindof UIView *inputAccessoryView NS_AVAILABLE_IOS(3_2);
当对象变为第一响应者时,显示另外的视图用来处理信息输入,比如UITextField,UITextView的键盘,自定义键盘就是用自定义的view替换
//视图立即被替换
-(void)reloadInputViews

获取undoManager

可以用来执行对应视图的undo和redo操作

http://www.th7.cn/Program/IOS/201603/774913.shtml

http://southpeak.github.io/2015/03/07/cocoa-uikit-uiresponder/

https://segmentfault.com/a/1190000004529341

http://www.jianshu.com/p/6dbd931eefb0

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

推荐阅读更多精彩内容

  • //// UIResponder.h// UIKit//// Copyright (c) 2005-2016...
    李某lkb阅读 787评论 0 0
  • 一. Hit-Testing 什么是Hit-Testing?对于触摸事件, window首先会尝试将事件交给事件触...
    面糊阅读 814评论 0 50
  • 好奇触摸事件是如何从屏幕转移到APP内的?困惑于Cell怎么突然不能点击了?纠结于如何实现这个奇葩响应需求?亦或是...
    Lotheve阅读 56,596评论 51 597
  • 本篇包括2部分:前篇是UIResponder的官方API的记录,后篇是对官方API的理解 UIResponder概...
    你好自己阅读 1,404评论 0 7
  • 1、你以为那些瞬间让你美白的面膜能让你一直美白到老吗? 不!可!能!那些面膜会让你老得更快!长期使用可出现多毛、痤...
    阿昱_阅读 177评论 0 0