在用戶使用app的過程中 會(huì)產(chǎn)生各種各樣的事件 大致可以分為3個(gè)類型
1,觸摸事件//如 點(diǎn)擊屏幕 拖拽....
2,加速計(jì)事件//如 搖一搖
3,遠(yuǎn)程控制事件//如 遙控器遠(yuǎn)程操作
在IOS中 不是任何對(duì)象都能處理事件的 ?只有繼承了 UIResponder的對(duì)象 才能接受并處理事件
UIApplication,UIViewController,UIView 都是繼承自 UIResponder 因此它們都是響應(yīng)者對(duì)象 ?都能夠接受并處理事件
無(wú)法進(jìn)行交互的情況
控件的透明度 在 0~0.01之間是無(wú)法接受交互的
控件的userInteractionEnable = NO 是無(wú)法進(jìn)行交互的
控件超出父控件的部分是無(wú)法接收交互的 ?即使設(shè)置clipToBounds=YES 能看見 也無(wú)法進(jìn)行交互
控件的hidden = YES 是無(wú)法進(jìn)行交互的
事件傳遞: ?就是當(dāng)產(chǎn)生交互事件時(shí) ?查到到最適合處理事件的對(duì)象
1, ?當(dāng)事件產(chǎn)生時(shí) ?主循環(huán)捕獲事件 ? 接下來(lái)進(jìn)行查找 尋找最適合處理事件的對(duì)象(即第一響應(yīng)者)
2,查找順序: ?UIApplication?—> UIWindow?—> rootViewController?—> UIView
在UIView中 會(huì)遍歷 它的子View 查看其是否適合 處理事件
在遍歷的時(shí)候 是按照該其 子View數(shù)組的 倒序來(lái)進(jìn)行遍歷//也就是從 顯示在最上面的開始遍歷
在觸摸事件實(shí)際查找時(shí)會(huì)調(diào)用下面的方法
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event;
//判斷該觸摸事件的 觸摸坐標(biāo) 是否在當(dāng)前的View上 ? 若在 則返回YES
-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event;
// 當(dāng)事件產(chǎn)生 時(shí) 會(huì)調(diào)用該方法
hitTest: withEvent: 方法內(nèi)部邏輯參考

hitTest: withEvent: 方法的活用
當(dāng) 我們不希望 第一響應(yīng)者 和 觸摸對(duì)象 一一對(duì)應(yīng)時(shí)//如 希望一個(gè)view的超出 父view的部分 可以響應(yīng)觸摸
則可以在 其父view的父view中 重寫hitTest方法 當(dāng)觸摸點(diǎn)在某個(gè)范圍時(shí) 則返回該view作為第一響應(yīng)者
//注意 在實(shí)現(xiàn)時(shí) 注意要選用統(tǒng)一的坐標(biāo)系
響應(yīng)者鏈條
若 事件傳遞完成 ?則找到了最佳的事件處理對(duì)象 ——> 成為 第一響應(yīng)者
當(dāng)?shù)谝豁憫?yīng)者 無(wú)法響應(yīng)事件 ?則會(huì)交給下一響應(yīng)者(nextResponder)來(lái)處理 若其無(wú)法處理 會(huì)在下一個(gè)NextResponder中尋找
若知道UIApplication時(shí) 都無(wú)法響應(yīng) 則丟棄該事件

view 的nextResponder的選擇: ?若有控制器 管理該控件 則nextResponder為其控制器 ——>父View
若無(wú)控制器 管理該對(duì)象 則nextResponder 為其父View
其他的nextResponder選擇
RootViewController?—> UIWindow?—> UIApplication?—> nil
在響應(yīng)鏈 中 無(wú)論這個(gè)第一響應(yīng)者 是否對(duì)這個(gè)事件 進(jìn)行了處理 都會(huì)響應(yīng)到 UIApplication ?如果想要中斷響應(yīng)鏈 ?則在 重寫的Touch方法中 不調(diào)用其父類方法
簡(jiǎn)書用的不熟練 排版有些難看 歡迎大家多多指正 共同學(xué)習(xí)