UIView系統(tǒng)自帶的并不能處理事件,所以我們給UIVIew加上處理事件的能力從而來研究iOS的事件處理
UITouch
1.觸摸事件方法中的UITouch都是同一個對象,因為一根手指對應一個UITouch.當手指移動或者抬起税课,并不會產(chǎn)生一個新的UITouch對象給你,而是改變UITouch里面的屬性琐鲁,
1.默認三個方法里面只能獲取到一個手指,為什么围段。UIView不支持多點觸控
2.怎么才能有兩個手指,兩個手指同時按投放,并且視圖支持多點觸控
3.UITouch的tapCount有什么用奈泪?可以判斷用戶當前是雙擊還是單擊
4.UITouch的phase有什么用? 根據(jù)這個屬性,判斷當前需要調(diào)用哪個處理事件方法涝桅,begin,move,end
程序思路:
* 在TouchMove里面做事情-為什么?因為用戶手指在視圖上移動的時候才需要移動視圖拜姿。
* 獲取用戶當前的位置冯遂,獲取用戶之前的位置砾隅,就知道用戶從哪移動到哪,這個位置也是視圖移動的位置
* 當前視圖的位置 = 上一次視圖的位置 + 手指的偏移量
//關鍵方法
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"%@---touchesBegan",[self class]);
}
02-事件傳遞
* 事件,加入到一個由誰管理的事件隊列中?UIApplication
* 為什么用隊列债蜜,不用棧晴埂。隊列先進先出寻定,意味著先產(chǎn)生的事件儒洛,先處理狼速。
- 代碼驗證事件誰處理
- 界面上這么多view,驗證哪個view處理事件向胡。這么多view,都需要監(jiān)重寫一個方法僵芹,搞個父類。
- 一個view能處理事件拇派,意味著事件傳遞給他了,那怎么傳遞? 事件是由父控件傳遞給子控件件豌。
- 父控件不處理事件,子控件也不能骡显。藍色不接收事件,黃色也不會接收事件? 為什么惫谤,因為事件是從父控件傳遞給子控件的遭殉。父控件都沒有事件石挂,怎么傳給子控件险污。
- 代碼驗證view不能處理事件
- 一個view怎么不能處理事件。userInteractionEnabled = NO蛔糯,hidden = YES,alpha <= 0.01
- 代碼驗證UIImageView不允許交互
- UIImageView默認不允許用戶交互动壤,因此默認它上面的子控件不能接收事件。
- 怎么找到最合適的View琼懊?通過一個遞歸。
- 第一個接收事件的控件是誰?窗口
- 當事件傳遞給窗口的時候爬早,就會讓窗口去找最合適的view,1> 判斷自己能不能接收事件 2> 點在不在窗口上 3> 去找比自己更合適的view,從后往前遍歷子控件筛严,拿到子控件后,把事件傳遞給這個子控件 4> 子控件拿到事件之后车胡,又會做同樣的判斷照瘾,一直遞歸去找匈棘,直到找到最合適的view.
- 事件傳遞的目的何在?找到最合適的view,把事件交給他析命。
hitText方法和pointInside方法
1. hitText什么時候調(diào)用:當一個事件傳遞給一個控件的時候羹饰,控件就會調(diào)用這個方法
2. hitText作用: 尋找到最合適的view。
* (回顧下事件傳遞)碳却,UIApplication -> UIWindow
* UIWindow去尋找最合適的view? [UIWindow hitTest:withEvent:]里面做了什么事情?
1> 判斷窗口能不能處理事件? 如果不能昼浦,意味著窗口不是最合適的view倦沧,而且也不會去尋找比自己更合適的view,直接返回nil,通知UIApplication,沒有最合適的view油狂。
2> 判斷點在不在窗口
3> 遍歷自己的子控件默色,尋找有沒有比自己更合適的view
4> 如果子控件不接收事件,意味著子控件沒有找到最合適的view,然后返回nil,告訴窗口沒有找到更合適的view,窗口就知道沒有比自己更合適的view,就自己處理事件虐沥。
* 驗證下hitTest方法返回nil泽艘,里面的子控件能處理事件嗎镐依? 重寫根控制器view的hitTest:withEvent:方法,
* 驗證這個方法是否真能找到最合適的view槐壳?
* 如果點擊屏幕任何一個地方,都是白色的view雳攘,怎么做。直接返回白色的view,就不會繼續(xù)去找白色view的子控件了吨灭。
* pointInside方法
* pointInside作用:判斷一個點在不在一個控件上
* point參數(shù):方法調(diào)用者坐標系上的點崇堰,
* 學習完了pointInside,就能實現(xiàn)下hitTest方法底層是怎么做的了。
響應者鏈條(結(jié)合自己的demo寫的 有點抽象)
* touch默認做法:自己不處理事件海诲,交給上一個響應者處理touch事件。
* 響應者鏈條咨演,點擊綠色的view,如果不處理事件,就會往上傳遞薄风。
* 驗證touch的默認做法 先恢復所有view的默認做法
* 監(jiān)聽黃色點擊拍嵌,藍色點擊遭赂。
* 黃色調(diào)用默認做法横辆,事件傳遞給誰處理?藍色
* 得出結(jié)論:1> touch的默認做法:自己不處理,交給上一個響應者困肩。 2> 上一個響應者默認是父控件
* 兩個view怎么同時處理事件?一個view處理方法,在調(diào)用父類默認的做法
* 把事件傳遞給白色的view锌畸,怎么做?
* 總結(jié)下事件傳遞的完整過程.
* 把事件傳遞給控制器靖避,測試白色view的上一個響應者是否是控制器比默。
* 回顧響應者鏈條
滿地打滾賣萌求贊卸耘,如果本文幫助到你退敦,輕點下方的紅心蚣抗,給作者君增加更新的動力瓮下。