1. 程式人生 > >iOS 知識梳理(響應鏈)

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。