標籤:
事件的產生以及傳遞事件是怎麼樣產生與傳遞的?
1.當發生一個觸摸事件後,系統會將該事件加入到一個由UIApplication管理的事件隊列中. 2.UIApplication會從事件隊列中取出最前面的事件,交給主視窗window. 3.主視窗會在視圖階層中找到一個最合適的視圖來處理觸摸事件 觸摸事件的傳遞是從父控制項傳遞到子控制項的. 如果一個父控制項不能接收事件,那麼它裡面的子控制項也不能夠接收事件.
一個控制項什麼情況下不能夠接收事件?
1.不接收使用者互動時不能夠處理事件 userInteractionEnabled = NO 2.當一個控制項隱藏的時候不能夠接收事件 Hidden = YES的時候 3.當一個控制項為透明的時候也不能夠接收事件 注意:UIImageView的userInteractionEnabled預設就是NO, 因此UIImageView以及它的子控制項預設是不能接收觸摸事件的
如何尋找最合適的View?
1.先判斷自己是否能夠接收觸摸事件,如果能再繼續往下判斷,2.再判斷觸摸的當前點在不在自己的身上.3.如果在自己身上,它會從後往前遍曆子控制項,遍曆出每一個子控制項後,重複前面的兩個步驟.4.如果沒有合格子控制項,那麼它自己就是最適合的View
hitTest方法
作用:尋找最適合的View
參數:當前手指所在的點.產生的事件
傳回值:返回誰, 誰就是最適合的View.
什麼時候用調用:只要一個事件,傳遞給一個控制項時, 就會調用這個控制項的hitTest方法-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
pointInside方法
作用:判斷point在不在方法調用者上
point:必須是方法調用者的座標系
什麼時候調用:hitTest方法底層會調用這個方法,判斷點在不在控制項上.
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
return YES;}
hitTest方法底層實現作用:當一個事件傳遞給當前View的時候就會調用這個方法.當前手指在螢幕上的點當前產生的事件
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{ //1.查看自己能不能接收事件 if(self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01){ return nil; } //2.判斷當前的點在不在自己身上. if(![self pointInside:point withEvent:event]){ return nil; } //查看自己是不是最適合的view //從後往前遍曆自己的子控制器. int count = (int)self.subviews.count; for (int i = count - 1; i >=0; i--) { //取出子控制器. UIView *childView = self.subviews[i]; // 要把當前的點轉換成子控制項上的座標點. CGPoint childP = [self convertPoint:point toView:childView]; UIView *view = [childView hitTest:childP withEvent:event]; //如果有值,直接返回,返回的就是最適合的View. if (view) { return view; } } //沒有找到比自己更適合的View.自己就是最適合的View return self;} 事件的響應 事件響應過和程
使用者點擊螢幕後產生的一個觸摸事件,經過一系列的傳遞過程後,會找到最合適的視圖控制項來處理這個事件,
找到最合適的視圖控制項後,就會調用控制項的touches方法來作具體的事件處理那這些touches方法的預設做法是將事件順著響應者鏈條向上傳遞,將事件交給上一個響應者進行處理
什麼是響應者鏈條,響應者對象
是由多個響應者對象串連起來的鏈條.繼承了UIResponder對象我們稱之為響應者對象,也就是能處理事件的對象.
事件傳遞與響應的完整過程
在產生一個事件時,系統會將該事件加入到一個由UIApplication管理的事件隊列中,
UIApplication會從事件隊列中取出最前面的事件,將它傳遞給先發送事件給應用程式的主視窗.
主視窗會調用hitTest方法尋找最適合的視圖控制項,找到後就會調用視圖控制項的touches方法來做具體的事情.
當調用touches方法,它的預設做法, 就會將事件順著響應者鏈條往上傳遞,傳遞給上一個響應者,接著就會調用上一個響應者的touches方法
如何去尋找上一個響應者
1.如果當前的View是控制器的View,那麼控制器就是上一個響應者.
2.如果當前的View不是控制器的View,那麼它的父控制項就是上一個響應者.
3.在視圖階層的最頂級視圖,如果也不能處理收到的事件或訊息,則其將事件或訊息傳遞給window對象進行處理
4.如果window對象也不處理,則其將事件或訊息傳遞給UIApplication對象5.如果UIApplication也不能處理該事件或訊息,則將其丟棄
事件傳遞的完整過程
1.先將事件對象由上往下傳遞(由父控制項傳遞給子控制項),找到最合適的控制項來處理這個事件。 2.調用最合適控制項的touches….方法 3.如果調用了[super touches….];就會將事件順著響應者鏈條往上傳遞,傳遞給上一個響應者 4.接著就會調用上一個響應者的touches….方法
iOSUI-事件處理