iOS事件傳遞與響應(yīng)鏈

在 iOS 開發(fā)中,事件傳遞和響應(yīng)鏈是處理用戶交互的核心機制。以下是其工作原理的簡要說明:

1. 事件傳遞

當用戶與屏幕交互時(如觸摸),系統(tǒng)會生成一個事件并傳遞給應(yīng)用。事件傳遞的過程如下:

  • UIApplication:事件首先到達 UIApplication 單例對象。
  • UIWindow:UIApplication 將事件傳遞給 UIWindow。
  • Hit-Testing:UIWindow 通過 hitTest:withEvent: 方法找到事件發(fā)生的最上層視圖(即命中視圖)。
hitTest:withEvent: 方法的工作流程:
  1. 檢查視圖是否可交互(userInteractionEnabledhidden、alpha > 0.01)。
  2. 檢查觸摸點是否在視圖范圍內(nèi)。
  3. 從后向前遍歷子視圖,調(diào)用子視圖的 hitTest:withEvent: 方法。
  4. 如果沒有子視圖處理事件,視圖自身將處理。

2. 響應(yīng)鏈

響應(yīng)鏈由一系列響應(yīng)者對象(UIResponder 實例)組成,用于處理事件。常見的響應(yīng)者包括 UIView、UIViewController、UIApplication 等。

  • 命中視圖:事件首先傳遞給命中視圖。
  • 向上傳遞:如果命中視圖不處理事件,事件會沿響應(yīng)鏈向上傳遞,通常是父視圖或視圖控制器。
  • UIApplication:如果最終沒有響應(yīng)者處理事件,事件會到達 UIApplication,若仍未被處理,則被丟棄。

響應(yīng)鏈的順序通常為:

  1. 命中視圖
  2. 父視圖
  3. 視圖控制器
  4. UIWindow
  5. UIApplication

3. 示例

假設(shè)有一個 UIButton 在 UIView 中,UIView 在 UIViewController 的根視圖中:
用戶點擊按鈕,事件傳遞給按鈕。
如果按鈕不處理事件,事件傳遞給 UIView。
如果 UIView 也不處理,事件傳遞給 UIViewController。
最終,如果 UIViewController 不處理,事件到達 UIApplication。

4. 自定義事件處理

可以通過重寫 hitTest:withEvent:pointInside:withEvent:自定義事件傳遞邏輯,或重寫touchesBegan:withEvent:等方法自定義事件處理。

總結(jié)

事件傳遞:「從上到下」通過 hitTest:withEvent: 找到命中視圖。
響應(yīng)鏈:「從下到上」事件沿響應(yīng)鏈傳遞,直到有響應(yīng)者處理或到達 UIApplication。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容