iOS-觸摸事件-事件的傳遞過程和響應者鏈條,ios-鏈條

來源:互聯網
上載者:User

iOS-觸摸事件-事件的傳遞過程和響應者鏈條,ios-鏈條

1.ios當中常用的事件分為三種:

觸摸事件

加速計事件

遠端控制事件

2.為什麼說繼承了UIResponder就能夠處理事件

因為UIResponder內部提供了以下方法來處理事件

比如觸摸事件會調用以下方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

加速計事件會調用:

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;

- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;

遠端控制事件會調用:

- (void)remoteControlReceivedWithEvent:(UIEvent *)event;

3.UIView的觸摸事件的監聽方法

UIView的觸摸事件主要有:

一根或者多根手指開始觸摸view,系統會自動調用view的下面方法.

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

一根或者多根手指在view上移動時,系統會自動調用view的下面方法

(隨著手指的移動,會持續調用該方法,也就是說這個方法會調用很多次)

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

一根或者多根手指離開view,系統會自動調用view的下面方法

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

觸摸結束前,某個系統事件( 如電話呼)會打斷觸摸過程,系統會 動調view的方法

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

參數說明:

touches:

touches中存放的都是UITouch對象,它是一個NSSet集合.

UITouch對象它就是用來儲存手指相關聯的資訊.包括位置,時間,階段等資訊.

每一個手指對應著一個UITouch對象.

這個UITouch是系統自動幫我們建立的,當手指移動時,系統會更新同一個UITouch對象,

使它能夠一直儲存該手指在的觸摸位置

當手指離開螢幕時,系統會銷毀相應的UITouch對象

UITouch屬性

● 觸摸產生時所處的視窗

@property(nonatomic,readonly,retain)UIWindow *window

● 觸摸產生時所處的視圖

@property(nonatomic,readonly,retain)UIView *view
● 短時間內點按螢幕的次數,可以根據tapCount判斷單擊、雙擊或更多的點擊

@property(nonatomic,readonly)NSUIntegertapCount;

● 記錄觸摸事件產生或變化時的時間,單位是秒

@property(nonatomic,readonly)NSTimeIntervaltimestamp;

● 當前觸摸事件所處的狀態

@property(nonatomic,readonly)UITouchPhasephase;

通過擷取UITouch屬性,我們可以獲得觸摸產生時所處的視窗,觸摸的View,時間,點擊的次數等,

這些都可以在通過UITouch擷取.

UITouch方法

● -(CGPoint)locationInView:(UIView*)view;

傳回值表示觸摸在view上的位置

這李返回的位置是針對view的座標系的(以view的左上 為原點(0, 0))

調永時傳 的view參數為nil的話,返回的是觸摸點在UIWindow的位置

- (CGPoint)previousLocationInView:(UIView*)view;

該方法記錄了前一個觸摸點的位置

UIEvent

●每產生一個事件,就會產生一個UIEvent對象
● UIEvent:稱為事件對象,記錄事件產生的時刻和類型

●常見屬性事件類型

@property(nonatomic,readonly) UIEventType     type;@property(nonatomic,readonly) UIEventSubtype  subtype;

事件產生的時間
@property(nonatomic,readonly)NSTimeIntervaltimestamp;

●UIEvent還提供 相應的方法可以獲得在某個view上 的觸摸對象(UITouch)

touches和event參數

一次完整的觸摸過程,會經曆3個狀態:

觸摸開始:- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

觸摸移動:- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

觸摸結束:- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

觸摸取消(可能會經曆):- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

一次完整的觸摸過程中,只會產生一個事件對象,4個觸摸方法都是同一個event參數

如果兩根手指同時觸摸一個view,那麼view只會調用一次touchesBegan:withEvent:方法,touches參數中裝著2個 UITouch對象

如果這兩根手指一前一後分開觸摸同一個view,那麼view會分別調用2次touchesBegan:withEvent:方法,

並且每次調用時的touches參數中只包含一個UITouch對象

事件傳遞:

注意:

UIView不接收觸摸事件的三種情況.

不接收使用者互動

userInteractionEnabled=NO.

隱藏

hidden=YES.

透明

alpha=0.0 ~ 0.01

提示:UIImageView的userInteractionEnabled預設就是NO,因此UIImageView以

及它的子控制項預設是不能接收觸摸事件的

總結:觸摸事件處理的詳細過程

①找到最合適的視圖

發生觸摸事件後,系統會將該事件加入到一個由UIApplication管 的事件隊列中
①.UIApplication會從事件隊列中取出最前面的事件,並將事件分發下去以便處理 ,通

常,先發送事件給應應用程式的主窗 (keyWindow)
②主視窗會在視圖階層中找到一個最合適的視圖來處理觸摸事件,這也是整個事件處理

過程的第一步

如何找到最合適的視圖呢

1.自己是否能接收觸摸事件
2.觸摸點是否在自己身上
3.從後往前遍曆子控制項,重複前面的兩個步驟
4.如果沒有合格子控制項,那麼就自己最適合處理

②找到最合適的視圖控制項後,就會調用控制項的touches方法來作具體的事件處

touchesBegan...

touchesMoved...
touchedEnded...

③這些touches方法的預設做法是將事件順著響應者鏈條向上傳遞,將事件交給上一個響應者進行處理

響應者鏈條

響應者鏈的事件傳遞過程

如果view的控制器存在,就傳遞給控制器;如果控制器不存在,則將其傳遞給它的父視圖

在視圖階層的最頂級視圖,如果也不能處理收到的事件或訊息,則其將事件或訊息傳遞給window對象進行處理

如果window對象也不能處理 ,則其將事件或訊息傳遞給UIApplication對象如果UIApplication也不能處理該事件或訊息,則將其丟棄

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.