-[UIView hitTest:withEvent:] 方法總結
現象
- -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: 方法返回的視圖決定最後響應事件的對象。
總結
- 在默認狀況下,即不重寫上述兩個方法的狀況下,當點擊屏幕時,會從最底層的父視圖開始向上逐級遍歷,直到最頂層的子視圖。若是發現觸摸點在當前視圖範圍內,就會遍歷當前視圖的子視圖,檢測觸點是否在其子視圖範圍內,若是在子視圖範圍內就檢測該子視圖的子視圖,重複這個過程直到找到一個視圖它沒有子視圖知足觸摸點在其範圍內,換句話說就是找到一個觸點在其範圍內的最頂層的視圖。
歡迎關注本站公眾號,獲取更多信息