在 iOS 中,事件傳遞與響應機制的核心是 事件傳遞 (hit-testing) 和 響應者鏈 (Responder Chain)。事件如何從屏幕觸發到最終由某個視圖或控制器處理,完全依賴這兩套機制。
📌 事件傳遞流程
- 事件產生 用户觸摸屏幕時,系統會生成一個
UIEvent對象,並交由應用程序處理。 - UIApplication → UIWindow 事件首先傳遞給
UIApplication,再交給當前活動的UIWindow。 - hitTest:withEvent:
UIWindow調用hitTest:withEvent:方法,內部通過pointInside:withEvent:判斷觸摸點是否在視圖範圍內。- 系統會 倒序遍歷子視圖(後添加的視圖優先),遞歸查找最合適的響應視圖。
- 最終返回的視圖就是 第一響應者 (First Responder)。
- 條件過濾 在
hitTest內部,系統會檢查視圖是否滿足:
hidden == NOuserInteractionEnabled == YESalpha > 0.01若不滿足,視圖不會成為響應者。
🔑 響應機制 (Responder Chain)
- UIResponder 只有繼承自
UIResponder的對象才能處理事件,例如:UIApplication、UIWindow、UIViewController、UIView。 - 響應鏈傳遞 當一個視圖成為第一響應者後,事件會沿着響應鏈傳遞:
- 當前視圖 → 父視圖 → 視圖控制器 → UIWindow → UIApplication。
- 如果某個對象未處理事件,系統會繼續向上層傳遞,直到找到合適的響應者或最終丟棄。
- 常用方法
touchesBegan:withEvent:touchesMoved:withEvent:touchesEnded:withEvent:touchesCancelled:withEvent:這些方法可在響應者對象中重寫,用於處理觸摸事件。
🎯 實際應用場景
- 擴大按鈕點擊範圍:通過重寫
pointInside:withEvent:方法,增加響應區域。 - 事件穿透:在某些場景下可讓事件繼續傳遞到下層視圖。
- 複雜界面調試:利用
hitTest打印事件傳遞路徑,定位響應者。
⚡ 總結
- 事件傳遞:通過
hitTest和pointInside找到第一響應者。 - 事件響應:依靠響應者鏈逐級傳遞,直到事件被處理。
- 關鍵點:理解 hit-testing 與 Responder Chain,是掌握 iOS 交互機制的核心。