iOS 知識梳理(響應鏈)
一直在寫程式碼,忙忙碌碌卻碌碌無為,所以最近想稍微沉澱一下,補充一下自己的理論基礎,先從最常用的響應鏈開始吧。。。
一、如何理解iOS的響應鏈?
第一要明確的是能夠接受和處理事件的響應者都是UIResponder的例項,包括UIView,UIViewController,UIApplication等。UILayer不包括在其中。
第一響應者由UIKit指定,當然根絕事件型別有所變化
Touch event
-
第一響應者是觸控事件產生的view
-
Press event
第一響應者是焦點響應者。
-
Shake-motion events,Remote-control events,Editing menu messages
第一響應者是你或者UIKit指定的物件。
響應分兩部分,第一,UIKit如何找到第一個響應者? 第二,響應鏈如何傳遞
找到第一響應者
UIKit使用基於檢視的hit-testing來確定Touch事件在哪裡產生。
UIView的hitTest:withEvent:方法在檢視層級中執行,尋找最深的包含指定Touch的子檢視,這個檢視將成為Touch事件的第一響應者。
該方法會呼叫子檢視poiotInside:withEvent:方法來確定哪個子檢視來響應該touch
簡單理解起來就是從最底層開始遍歷自己的子檢視能否響應,直到找到最深一層的檢視,當然會有一些邊界判斷,如果不在邊界內,其所有子檢視都忽略了,如果view不能響應其子檢視當然也就全忽略了。
UIView 在一下三種情況下是不能響應事件的
-
hidden = YES
-
userInteractionEnabled = NO
-
alpha < 0.01
響應鏈傳遞
這是官方給的預設響應鏈,由UIKit預設實現,當然你也可以改變屬性來改變響應鏈
nextResponder該屬性修改可以改變響應鏈,改變以後下個響應者就是自己定義的了
有些已經又UIKit預設實現了
比如UIViewController的view 的下一個響應者就是controller,window的rootViewController 下一個響應者就是window,window的下一個響應者為UIApplication,application的下一個響應者是apdelegate。