總體來說,分2個步驟:
一,從上到下尋找合適的控件來處理這個觸摸事件。如下圖,如果點擊了黃色4,則UIapplication -> UIWindow -> 1白色 -> 2橙色 -> 3藍色 -> 4黃色。
二,找到4黃色后,再從下到上遍歷響應者鏈條:4黃色 -> 3藍色 -> 2橙色 -> 1白色 -> UIWindow -> UIApplication
1)如果4黃色實現了touches...這些函數(具體下面第二條)且沒有調用 super...則事件不再向上傳遞;如果調用了super...方法則事件會繼續向上傳遞。
2)如果4黃色沒有實現touches...這些函數,則直接向上傳遞。
詳細介紹:
1 什么是響應者對象
在iOS中不是任何對象都能處理事件,只有繼承了UIResponder的對象才能接收并處理事件。我們稱之為“響應者對象”
2 觸摸事件常用處理方法
提示:touches中存放的都是UITouch對象
3 UITouch對象
當用戶用一根手指觸摸屏幕時,會創建一個與手指相關聯的UITouch對象,一個手指對應一個UITouch對象。如果有兩個手指則會有UITouch對象,因此可以根據(NSSet *)touches的個數來判斷有幾個手指。
作用:
4 UIView不接收觸摸事件的三種情況
提示:UIImageView的userInteractionEnabled默認是NO,因此它和它的子控件默認不能接收觸摸事件。
5 尋找合適的響應者
從上到下尋找合適的控件,比如UIApplication -> UIWindow ->父控件子控件這樣一級一級的找下去。
尋找順序,或原則
調用的兩個函數:- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
總結:很明顯,如果父控件不能接收,則不再找子控件。
6 響應者鏈條
從下到上尋找合適的控件來處理這個事件,如果實現了touches。。。函數且沒有調用super方法則事件不再向上傳,如果沒有實現touches或者在touches里面調用了super方法則事件繼續向上傳。(super不是指的父類,而是上一個響應者)
提示:如果當前的view是控制器的view,那控制器就是上一級響應者,否則上一級響應者為父控件。
7 自己實現touches...
如果沒有調用super...,則系統不會做默認的處理,比如實現了UIButton的touchBegan方法則系統不會執行button的敲擊事件(不發送消息)。
新聞熱點
疑難解答