UIView的觸摸事件處理
UIView是UIResponder的子類帽哑,可以覆蓋下列4個(gè)方法處理不同的觸摸事件
一根或者多根手指開始觸摸view,系統(tǒng)會(huì)自動(dòng)調(diào)用view的下面方法
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
一根或者多根手指在view上移動(dòng),系統(tǒng)會(huì)自動(dòng)調(diào)用view的下面方法(隨著手指的移動(dòng)晋柱,會(huì)持續(xù)調(diào)用該方法)
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
一根或者多根手指離開view壁晒,系統(tǒng)會(huì)自動(dòng)調(diào)用view的下面方法
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
觸摸結(jié)束前,某個(gè)系統(tǒng)事件(例如電話呼入)會(huì)打斷觸摸過程疗琉,系統(tǒng)會(huì)自動(dòng)調(diào)用view的下面方法
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
提示:touches中存放的都是UITouch對(duì)象
UITouch是什么
當(dāng)用戶用一根手指觸摸屏幕時(shí)冈欢,會(huì)創(chuàng)建一個(gè)與手指相關(guān)聯(lián)的UITouch對(duì)象
一根手指對(duì)應(yīng)一個(gè)UITouch對(duì)象
UITouch的作用
保存著跟手指相關(guān)的信息,比如觸摸的位置盈简、時(shí)間凑耻、階段
當(dāng)手指移動(dòng)時(shí),系統(tǒng)會(huì)更新同一個(gè)UITouch對(duì)象柠贤,使之能夠一直保存該手指在的觸摸位置
當(dāng)手指離開屏幕時(shí)香浩,系統(tǒng)會(huì)銷毀相應(yīng)的UITouch對(duì)象
提示:iPhone開發(fā)中,要避免使用雙擊事件臼勉!
UITouch的屬性
觸摸產(chǎn)生時(shí)所處的窗口
@property(nonatomic,readonly,retain) UIWindow *window;
觸摸產(chǎn)生時(shí)所處的視圖
@property(nonatomic,readonly,retain) UIView *view;
短時(shí)間內(nèi)點(diǎn)按屏幕的次數(shù)邻吭,可以根據(jù)tapCount判斷單擊、雙擊或更多的點(diǎn)擊
@property(nonatomic,readonly) NSUInteger tapCount;
記錄了觸摸事件產(chǎn)生或變化時(shí)的時(shí)間宴霸,單位是秒
@property(nonatomic,readonly) NSTimeInterval timestamp;
當(dāng)前觸摸事件所處的狀態(tài)
@property(nonatomic,readonly) UITouchPhase phase;
UITouch的方法
- (CGPoint)locationInView:(UIView *)view;
返回值表示觸摸在view上的位置
這里返回的位置是針對(duì)view的坐標(biāo)系的(以view的左上角為原點(diǎn)(0, 0))
調(diào)用時(shí)傳入的view參數(shù)為nil的話囱晴,返回的是觸摸點(diǎn)在UIWindow的位置
- (CGPoint)previousLocationInView:(UIView *)view;
該方法記錄了前一個(gè)觸摸點(diǎn)的位置
UIEvent是什么
每產(chǎn)生一個(gè)事件,就會(huì)產(chǎn)生一個(gè)UIEvent對(duì)象
UIEvent:稱為事件對(duì)象瓢谢,記錄事件產(chǎn)生的時(shí)刻和類型
常見屬性
事件類型
@property(nonatomic,readonly) UIEventType type;
@property(nonatomic,readonly) UIEventSubtype subtype;
事件產(chǎn)生的時(shí)間
@property(nonatomic,readonly) NSTimeInterval timestamp;
UIEvent還提供了相應(yīng)的方法可以獲得在某個(gè)view上面的觸摸對(duì)象(UITouch)
touches和event參數(shù)
一次完整的觸摸過程畸写,會(huì)經(jīng)歷3個(gè)狀態(tài):
觸摸開始:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
觸摸移動(dòng):
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
觸摸結(jié)束:
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
觸摸取消(可能會(huì)經(jīng)歷):
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
4個(gè)觸摸事件處理方法中,都有NSSet *touches和UIEvent *event兩個(gè)參數(shù)
一次完整的觸摸過程中氓扛,只會(huì)產(chǎn)生一個(gè)事件對(duì)象枯芬,4個(gè)觸摸方法都是同一個(gè)event參數(shù)
如果兩根手指同時(shí)觸摸一個(gè)view,那么view只會(huì)調(diào)用一次touchesBegan:withEvent:方法采郎,touches參數(shù)中裝著2個(gè)UITouch對(duì)象
如果這兩根手指一前一后分開觸摸同一個(gè)view千所,那么view會(huì)分別調(diào)用2次touchesBegan:withEvent:方法,并且每次調(diào)用時(shí)的touches參數(shù)中只包含一個(gè)UITouch對(duì)象
根據(jù)touches中UITouch的個(gè)數(shù)可以判斷出是單點(diǎn)觸摸還是多點(diǎn)觸摸