在 iOS 開發(fā)中,事件傳遞和響應(yīng)鏈是處理用戶交互的核心機制。以下是其工作原理的簡要說明:
1. 事件傳遞
當用戶與屏幕交互時(如觸摸),系統(tǒng)會生成一個事件并傳遞給應(yīng)用。事件傳遞的過程如下:
- UIApplication:事件首先到達 UIApplication 單例對象。
- UIWindow:UIApplication 將事件傳遞給 UIWindow。
- Hit-Testing:UIWindow 通過 hitTest:withEvent: 方法找到事件發(fā)生的最上層視圖(即命中視圖)。
hitTest:withEvent: 方法的工作流程:
- 檢查視圖是否可交互(
userInteractionEnabled、hidden、alpha > 0.01)。 - 檢查觸摸點是否在視圖范圍內(nèi)。
- 從后向前遍歷子視圖,調(diào)用子視圖的 hitTest:withEvent: 方法。
- 如果沒有子視圖處理事件,視圖自身將處理。
2. 響應(yīng)鏈
響應(yīng)鏈由一系列響應(yīng)者對象(UIResponder 實例)組成,用于處理事件。常見的響應(yīng)者包括 UIView、UIViewController、UIApplication 等。
- 命中視圖:事件首先傳遞給命中視圖。
- 向上傳遞:如果命中視圖不處理事件,事件會沿響應(yīng)鏈向上傳遞,通常是父視圖或視圖控制器。
- UIApplication:如果最終沒有響應(yīng)者處理事件,事件會到達 UIApplication,若仍未被處理,則被丟棄。
響應(yīng)鏈的順序通常為:
- 命中視圖
- 父視圖
- 視圖控制器
- UIWindow
- 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。