在 iOS 中,事件傳遞與響應機制的核心是 事件傳遞 (hit-testing)響應者鏈 (Responder Chain)。事件如何從屏幕觸發到最終由某個視圖或控制器處理,完全依賴這兩套機制。

📌 事件傳遞流程

  1. 事件產生 用户觸摸屏幕時,系統會生成一個 UIEvent 對象,並交由應用程序處理。
  2. UIApplication → UIWindow 事件首先傳遞給 UIApplication,再交給當前活動的 UIWindow
  3. hitTest:withEvent:
  • UIWindow 調用 hitTest:withEvent: 方法,內部通過 pointInside:withEvent: 判斷觸摸點是否在視圖範圍內。
  • 系統會 倒序遍歷子視圖(後添加的視圖優先),遞歸查找最合適的響應視圖。
  • 最終返回的視圖就是 第一響應者 (First Responder)
  1. 條件過濾hitTest 內部,系統會檢查視圖是否滿足:
  • hidden == NO
  • userInteractionEnabled == YES
  • alpha > 0.01 若不滿足,視圖不會成為響應者。

🔑 響應機制 (Responder Chain)

  • UIResponder 只有繼承自 UIResponder 的對象才能處理事件,例如:UIApplicationUIWindowUIViewControllerUIView
  • 響應鏈傳遞 當一個視圖成為第一響應者後,事件會沿着響應鏈傳遞:
  • 當前視圖 → 父視圖 → 視圖控制器 → UIWindow → UIApplication。
  • 如果某個對象未處理事件,系統會繼續向上層傳遞,直到找到合適的響應者或最終丟棄。
  • 常用方法
  • touchesBegan:withEvent:
  • touchesMoved:withEvent:
  • touchesEnded:withEvent:
  • touchesCancelled:withEvent: 這些方法可在響應者對象中重寫,用於處理觸摸事件。

🎯 實際應用場景

  • 擴大按鈕點擊範圍:通過重寫 pointInside:withEvent: 方法,增加響應區域。
  • 事件穿透:在某些場景下可讓事件繼續傳遞到下層視圖。
  • 複雜界面調試:利用 hitTest 打印事件傳遞路徑,定位響應者。

⚡ 總結

  • 事件傳遞:通過 hitTestpointInside 找到第一響應者。
  • 事件響應:依靠響應者鏈逐級傳遞,直到事件被處理。
  • 關鍵點:理解 hit-testingResponder Chain,是掌握 iOS 交互機制的核心。