UI高級之事件的響應者鏈

一、事件的響應

在上一篇博客裏面講解了 事件的分發實際上就是 一層一層的給視圖發送消息 然後找到觸摸點所在多視圖。

那麼當找到了視圖之後事件又是怎麼處理的呢?


在上一篇博客講解了事件的分發,現在來看看事件的響應。

當我們點擊了view2點時候,經過一系列的查找找到view2上發生了觸摸事件,那麼view2就接受到事件。


每個視圖或者視圖控制器都有4個觸摸事件:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event (方法1)

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event (方法2)

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event (方法3)

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event(方法4)


參數:touches裏面存儲的是所有觸摸的UITouch對象,UITouch對象有4個屬性,tapcount 點擊的次數 view 對象所屬的視圖 window 對象所屬的窗口 phrase 在觸摸過程中有一個觸摸週期,開始 移動 結束 中途取消  可以根據phrase判斷所處的狀態。


UITouch *touch = [touches anyObject];//獲取觸摸對象

 UIView *view = [touch view];

 NSInteger tagCount = [touch tapCount];



當我們點擊開始的時候 系統會在分發找到到視圖中調用方法1 、當我們點擊之後在視圖上移動時會調用方法2、手指離開屏幕的時候會調用方法3,當電話等優先級別高的事件來的時候會打斷當前運行的程序,此時會調用方法4.


因此我們需要處理的任務可以放在這些方法裏面實現。

現在我們假如不在view2的implement裏面實現上面的任何一個事件方法,則系統會將這個事件一直往視圖的父視圖myview上傳遞,假如myview上面有實現上述四個方法中某一個或者多個,則myview這個視圖將響應這個觸摸事件,如果也一個都沒實現那麼,向myview的父視圖window上傳遞,如果一個都沒實現則繼續向下一級傳遞,此時會傳遞給UIApplication 如果還是不能響應這個觸摸事件,則把事件傳遞給APPdelegete 對象,如果還是不能實現的話,則系統會將這個觸摸事件丟棄。

可以看到事件的傳遞的是一級一級往下傳遞的。不能響應則往下一級傳遞。


例如:在myview上添加一個點擊手勢 然後在view2 上點擊   

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(TapAction:)];

    singleTap.numberOfTapsRequired = 1;

    singleTap.numberOfTouchesRequired = 1;

    [myview addGestureRecognizer:singleTap];

-(void)TapAction:(UITapGestureRecognizer*)gesture

{

nslog(@"單擊");

}


輸出的是 :單擊 

因爲view2上沒有處理這個手勢 則會把這個手勢事件傳遞給他的父視圖 myview 而myview實現了這個手勢處理事件。




手勢:在蘋果提供的框架裏面封裝了幾個常用點手勢



上面幾個方法是經常用到的,特別是

requireGestureRecognizerToFail: 方法是解決手勢衝突的關鍵 因爲每個手勢的響應時間 在不同的狀態,因此有些在觸摸就開始響應的會屏蔽在後面響應的,這時就需要用到這個函數來先讓後面響應的識別失敗才響應默認的開始就響應對手勢。










發佈了34 篇原創文章 · 獲贊 9 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章