iOSUI-事件處理

來源:互聯網
上載者:User

標籤:

事件的產生以及傳遞事件是怎麼樣產生與傳遞的?
      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-事件處理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.