[UIViewhitTest:withEvent:]方法總結

NO IMAGE

現象

  • -hitTest:withEvent: 方法內部會調用 -pointInside:withEvent: 方法。
  • 一次點擊會觸發兩次 -hitTest:withEvent: 方法。
  • -pointInside:withEvent: 方法會判斷觸摸點是否在當前視圖範圍內。
  • -hitTest:withEvent: 方法根據 -pointInside:withEvent: 的返回值決定是否返回當前視圖。
  • 調用順序是,如果跨級,就從父視圖逐級向其子視圖遍歷調用;如果同級,就按照同級子視圖添加到其父視圖上的順序,從後向前遍歷,即後添加的先遍歷,先添加的後遍歷的 FILO 模式。
  • 如果父視圖的 -pointInside:withEvent: 方法返回 NO,就不會遍歷其子視圖;如果返回 YES,就會遍歷其子視圖,即調用其子視圖的 -hitTest:withEvent: 方法。
  • 如果一個子視圖的 -hitTest:withEvent: 方法返回值不為 nil,那麼就停止遍歷,不會繼續調用尚未遍歷過的同級子視圖的 -hitTest:withEvent: 方法。
  • -hitTest:withEvent: 方法返回的視圖決定最後響應事件的對象。

總結

  • 在默認情況下,即不重寫上述兩個方法的情況下,當點擊屏幕時,會從最底層的父視圖開始向上逐級遍歷,直到最頂層的子視圖。如果發現觸摸點在當前視圖範圍內,就會遍歷當前視圖的子視圖,檢測觸點是否在其子視圖範圍內,如果在子視圖範圍內就檢測該子視圖的子視圖,重複這個過程直到找到一個視圖它沒有子視圖滿足觸摸點在其範圍內,換句話說就是找到一個觸點在其範圍內的最頂層的視圖。

相關文章

iOS持續集成(二)——證書管理神器match

iOS持續集成(一)——fastlane使用

ObjectiveC之屬性

GCDAsyncSocket源碼閱讀