1> 事件處理簡介
3大事件:(主要)觸摸事件蛉谜、加速計(jì)事件、遠(yuǎn)程控制事件崇堵。
什么是響應(yīng)者對象
- 在iOS中不是任何對象都能處理事件型诚,只有繼承了UIResponder
的對象才能接收并處理事件。我們稱之為“響應(yīng)者對象”
- UIApplication鸳劳、UIViewController狰贯、UIView都繼承自UIResponder,因此它們都是響應(yīng)者對象赏廓,都能夠接收并處理事件-
為什么繼承
UIResponder
就能處理事件- UIResponder內(nèi)部提供了以下方法來處理事件
1.觸摸事件
- (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;
2.加速計(jì)事件
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;
3.遠(yuǎn)程控制事件
- (void)remoteControlReceivedWithEvent:(UIEvent *)event;
- 想處理觸摸事件涵紊,應(yīng)該怎么辦
- UIView是UIResponder的子類,可以覆蓋下列4個(gè)方法處理不同的觸摸事件
1.一根或者多根手指開始觸摸view幔摸,系統(tǒng)會自動調(diào)用view的下面方法
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
2.一根或者多根手指在view上移動摸柄,系統(tǒng)會自動調(diào)用view的下面方法(隨著手指的移動,會持續(xù)調(diào)用該方法)
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
3.一根或者多根手指離開view既忆,系統(tǒng)會自動調(diào)用view的下面方法
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
4.觸摸結(jié)束前驱负,某個(gè)系統(tǒng)事件(例如電話呼入)會打斷觸摸過程,系統(tǒng)會自動調(diào)用view的下面方法
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
提示:touches中存放的都是UITouch對象
重點(diǎn)UITouch
當(dāng)用戶用一根手指觸摸屏幕時(shí)患雇,會創(chuàng)建一個(gè)與手指相關(guān)聯(lián)的UITouch對象
一根手指對應(yīng)一個(gè)UITouch對象
UITouch的作用
保存著跟手指相關(guān)的信息跃脊,比如觸摸的位置、時(shí)間苛吱、階段當(dāng)手指移動時(shí)酪术,系統(tǒng)會更新同一個(gè)UITouch對象,使之能夠一直保存該手指在的觸摸位置
當(dāng)手指離開屏幕時(shí)翠储,系統(tǒng)會銷毀相應(yīng)的UITouch對象
提示:iPhone開發(fā)中拼缝,要避免使用雙擊事件!
1.觸摸事件方法中的UITouch都是同一個(gè)對象彰亥,因?yàn)橐桓种笇?yīng)一個(gè)UITouch.當(dāng)手指移動或者抬起咧七,并不會產(chǎn)生一個(gè)新的UITouch對象給你,而是改變UITouch里面的屬性任斋,
1.默認(rèn)三個(gè)方法里面只能獲取到一個(gè)手指继阻,為什么。
UIView不支持多點(diǎn)觸控
2.怎么才能有兩個(gè)手指废酷,兩個(gè)手指同時(shí)按瘟檩,并且視圖支持多點(diǎn)觸控
3.UITouch的tapCount有什么用?
可以判斷用戶當(dāng)前是雙擊還是單擊
4.UITouch的phase有什么用?
根據(jù)這個(gè)屬性澈蟆,判斷當(dāng)前需要調(diào)用哪個(gè)處理事件方法墨辛,begin,move,end
- 一般步驟
1.處理一個(gè)控件的觸摸事件步驟
1.1 自定義View
1.2 重寫touches方法
// NSSet:集合,無序
// 當(dāng)手指觸摸當(dāng)前控件的時(shí)候調(diào)用
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//
// NSLog(@"%d",touches.count);
// // 隨機(jī)取一個(gè)
// UITouch *touch = [touches anyObject];
// // 獲取當(dāng)前點(diǎn)
// CGPoint curP = [touch locationInView:self];
// NSLog(@"%@",NSStringFromCGPoint(curP));
NSLog(@"%s",__func__);
}
// 當(dāng)手指在當(dāng)前控件移動的時(shí)候調(diào)用
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
// 獲取UITouch
UITouch *touch = [touches anyObject];
// 獲取當(dāng)前點(diǎn)
CGPoint curP = [touch locationInView:self];
// 獲取上一次點(diǎn)
CGPoint preP = [touch previousLocationInView:self];
// 獲取x軸偏移量
CGFloat offsetX = curP.x - preP.x;
// 獲取y軸偏移量
CGFloat offsetY = curP.y - preP.y;
// 修改當(dāng)前控件的位置
// 修改形變
// CGAffineTransformMakeTranslation:相對于最開始的位置趴俘,使用Make睹簇,會把之前的所有形變清空奏赘,從零開始形變
// 相對于上一次的形變
self.transform = CGAffineTransformTranslate(self.transform, offsetX, offsetY);
NSLog(@"%s",__func__);
}
// 當(dāng)手指抬起的時(shí)候調(diào)用
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"%s",__func__);
}
// 當(dāng)觸摸事件被打斷的時(shí)候調(diào)用,比如打電話
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
}