觸摸事件和手勢

觸摸事件

1.事件是當(dāng)用戶手指觸擊屏幕及在屏幕上移動(dòng)時(shí)劳较,系統(tǒng)不斷發(fā)送給應(yīng)用程序的對象
2.系統(tǒng)將事件按照特定的路徑傳遞給可以對其進(jìn)行處理的對象
3.在iOS中规阀,一個(gè)UITouch對象表示一個(gè)觸摸,一個(gè)UIEvent對象表示一個(gè)事件(觸發(fā)事件的集合NSSet)
4.事件對象中包含與當(dāng)前多點(diǎn)觸摸序列相對應(yīng)的所有觸摸對象带迟,還可以提供與特定視圖或窗口相關(guān)聯(lián)的觸摸對象

觸摸的開始,移動(dòng)和結(jié)束
1.觸摸信息有時(shí)間和空間兩方面
-時(shí)間方面的信息稱為階段爬立,表示觸摸是否剛剛開始、是否正在移動(dòng)或處于靜止?fàn)顟B(tài)以及何時(shí)結(jié)束(生命周期)
-觸摸信息還包括當(dāng)前在視圖或窗口中的位置信息堰乔,以及之前的位置信息(如果有的話)
-當(dāng)一個(gè)手指接觸屏幕時(shí)偏化,觸摸就和某個(gè)窗口或視圖關(guān)聯(lián)在一起,這個(gè)關(guān)聯(lián)在事件的整個(gè)生命周期都會(huì)得到維護(hù)

在屏幕上的手指操作

UIRsponder 接口
-UIResponder類定義了對象相應(yīng)和控制事件的接口镐侯,是UIApplication侦讨、UIView的超類,這類的實(shí)例通常被稱為響應(yīng)對象
-這個(gè)類中主要的事件控制方法是
開始: touchesBegan:withEvent: 移動(dòng): touchesMoved:withEvent: 結(jié)束: touchesEnded:withEvent: 取消事件響應(yīng):touchesCancelled:withEvent:

四個(gè)手勢通知方法

//開始觸摸的方法
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //獲取所有的觸摸點(diǎn)數(shù)量
    NSInteger count=touches.count;
    NSLog(@"獲取點(diǎn)擊次數(shù)%ld",(long)count);
    
    //獲取tap數(shù)量
    NSInteger tapCount=[[touches anyObject] tapCount];
    NSLog(@"獲取點(diǎn)擊次數(shù)%ld",(long)tapCount);
    
    
    //先通過事件獲取觸摸點(diǎn)
    UITouch *touch=(UITouch *)[event touchesForView:self.view];
    
    //獲取眾多觸摸點(diǎn)中的其中一點(diǎn)
    UITouch *touch1=(UITouch *)[touches anyObject];
    
    //獲取觸摸點(diǎn)在self.view上的坐標(biāo)
    CGPoint point=[touch1 locationInView:self.view];
    NSLog(@"@(%f,%f)",point.x,point.y);
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"移動(dòng)中");
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"移動(dòng)結(jié)束");
}

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"取消事件響應(yīng)");//鼠標(biāo)點(diǎn)擊屏幕長按,然后按住command+shift+h(home鍵)
}

觸控事件響應(yīng)鏈
-響應(yīng)者 (UIResponder)
-響應(yīng)鏈
-之前提到過第一響應(yīng)者苟翻,該響應(yīng)者通常是用戶當(dāng)前正在交互的對象
1.第一響應(yīng)者是響應(yīng)鏈的開始
2.以UIResponder為父類的任何類都是響應(yīng)者
3.如果第一響應(yīng)者不處理某個(gè)事件韵卤,則將該事件傳遞到響應(yīng)者鏈的下一級,一般情況下如果下一級處理崇猫,則停止事件的傳遞
4.如果事件通過整個(gè)響應(yīng)者鏈并且沒有對象處理該事件怜俐,則丟棄該事件

響應(yīng)鏈順序

視圖->控件->視圖控制器->父視圖->父視圖控制器->窗口->應(yīng)用程序代理

向下一響應(yīng)者傳遞事件

可以在上面4個(gè)方法中調(diào)用傳遞事件的響應(yīng),將事件傳遞給下一個(gè)響應(yīng)者

[self.nextResponder touchesBegan:touches withEvent:event];
//這句用來把事件傳遞給下一響應(yīng)者,如果這句去掉,來就是不傳遞給下一個(gè)響應(yīng)者只有四個(gè)方法自己來響應(yīng),而無法把事件傳遞下去

手勢和觸摸的關(guān)系
1.手勢是指從用一個(gè)或多個(gè)手指接觸屏幕開始,直到手指離開屏幕為止發(fā)生的所有事件
2.觸摸是指手指放到屏幕上從屏幕上拖動(dòng)或抬起邓尤,手勢中涉及的觸摸數(shù)量等于同時(shí)位于屏幕上的手指數(shù)量
3.手勢是觸摸事件的集合

檢測觸摸和移動(dòng)

@interface ViewController : UIViewController
@property (nonatomic) int moveCount;
@property (retain, nonatomic) UILabel *messageLabel;
@property (retain, nonatomic) UILabel *tapsLabel;
@property (retain, nonatomic) UILabel *touchesLabel;
-(void) updateLabelsFromTouches:(NSSet *)touches;
@end

控制器代碼
因?yàn)楸卷?xiàng)目需要檢測多點(diǎn)觸控拍鲤,所以需要為視圖打開支持多點(diǎn)觸控開關(guān)
所以需要在viewDidLoad方法中添加如下代碼:
self.view.multipleTouchEnabled = YES;
-iPhone中最多同時(shí)可以支持5點(diǎn)觸摸
-iPad中最多同時(shí)可以支持11點(diǎn)觸摸。
-模擬器中按下option鍵汞扎,可以模擬兩點(diǎn)觸摸
-兩次單擊之間的間隔足夠小的話可以實(shí)現(xiàn)雙擊季稳,三擊甚至更多

手勢
用一個(gè)或多個(gè)手指接觸屏幕開始,知道手指離開屏幕為止所有的事件
手勢的種類

點(diǎn)擊(tap)
拖動(dòng)(drag)
滑動(dòng)(flick)
橫掃(swipe)
雙擊(double tap)
放大(pinch)
縮小(pinch)
長按(touch hold)

手勢識別器

UIGestureRecognizer

手勢識別器類型

-UITapGestureRecognizer      (輕拍識別器)
-UIPinchGestureRecognizer    (捏合識別器)
-UIRotationGestureRecognizer (旋轉(zhuǎn)識別器)
-UISwipeGestureRecognizer    (掃動(dòng)識別器)
-UIPanGestureRecognizer      (拖動(dòng)識別器)
-UILongPressGestureRecognizer(長按識別器)
-UIScreenEdgePanGestureRecognizer (右滑返回識別器)
通過拖拽來實(shí)現(xiàn)手勢的添加
在此把用戶交互界面打開.png

創(chuàng)建一個(gè)視圖用來做一下觸碰的實(shí)踐

找一張圖命名1.jpg放入項(xiàng)目中
在函數(shù)的實(shí)現(xiàn)文件中寫

[super viewDidLoad];
    //創(chuàng)建圖片視圖
    UIImageView *imgV=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 150, 150)];
    //創(chuàng)建圖片
    UIImage *img=[UIImage imageNamed:@"1.jpg"];
    //設(shè)置圖片
    imgV.image=img;
    //打開用戶交互,默認(rèn)是NO
    imgV.userInteractionEnabled=YES;
    //居中
    imgV.center=self.view.center;
    //顯示
    [self.view addSubview:imgV];

-UITapGestureRecognizer (輕拍識別器)

創(chuàng)建

 //---------------創(chuàng)建輕拍手勢
    UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction:)];
    //---------------給圖片視圖添加單擊手勢(單擊放大或縮小)
    [imgV addGestureRecognizer:tap];

手勢動(dòng)作方法

//實(shí)現(xiàn)輕拍手勢
-(void)tapAction:(UITapGestureRecognizer *)sender
{
    //獲取手勢所添加的視圖
    UIImageView *imgV=(UIImageView *)sender.view;
    
    if (self.imgVState)
    {
        //縮小
        [UIView animateWithDuration:1 animations:^{
            imgV.frame=CGRectMake(0, 0, 150, 150);
            imgV.center=self.view.center;
        }];
    }
    else
    {
        //放大
        [UIView animateWithDuration:1 animations:^{
            imgV.frame=CGRectMake(0, 0, 300, 300);
            imgV.center=self.view.center;
        }];
    }
    //取反用來反復(fù)縮小放大
    self.imgVState=!self.imgVState;
}

-UIPinchGestureRecognizer (捏合識別器)

先定義一個(gè)屬性

@interface ViewController ()
@property(nonatomic,assign)BOOL imgVState;//標(biāo)示圖片是放大還是縮小,YES放大/NO:縮小
@end

然后創(chuàng)建捏合識別器

//創(chuàng)建捏合手勢
    UIPinchGestureRecognizer *pinch=[[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinchAction:)];
    //添加捏合
    [imgV addGestureRecognizer:pinch];

創(chuàng)建捏合手勢的方法

//捏合的方法
-(void)pinchAction:(UIPinchGestureRecognizer *)sender
{
    sender.view.transform=CGAffineTransformScale(sender.view.transform, sender.scale, sender.scale);
    //捏合的速度設(shè)置(數(shù)字越大,捏合的速度越快)
    sender.scale=1;
}

-UIRotationGestureRecognizer (旋轉(zhuǎn)識別器)

先定義屬性

@interface ViewController ()
@property(nonatomic,assign)CGFloat rotation;//記錄每一次旋轉(zhuǎn)后的值
@end

然后創(chuàng)建旋轉(zhuǎn)識別器

//實(shí)現(xiàn)旋轉(zhuǎn)的手勢的方法
-(void)rotatingAction:(UIRotationGestureRecognizer *)sender
{
    UIImageView *imgV=(UIImageView *)sender.view;
    //設(shè)置圖片的旋轉(zhuǎn)大小
    imgV.transform=CGAffineTransformMakeRotation(sender.rotation+self.rotation);
    //旋轉(zhuǎn)結(jié)束狀態(tài)結(jié)束后記錄這次旋轉(zhuǎn)的角度
    if (sender.state==UIGestureRecognizerStateEnded)//如果結(jié)束的話便記錄下來
    {
        self.rotation=sender.rotation;
    }
}

-UISwipeGestureRecognizer (掃動(dòng)識別器)

創(chuàng)建掃動(dòng)識別器

 //---------------創(chuàng)建掃動(dòng)
    UISwipeGestureRecognizer *swipe=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeAction:)];
    //添加掃動(dòng)
    [imgV addGestureRecognizer:swipe];
    //設(shè)置掃動(dòng)的方向
    swipe.direction=UISwipeGestureRecognizerDirectionDown;;//向下掃動(dòng)
    [pan requireGestureRecognizerToFail:swipe];//當(dāng)掃動(dòng)swipe失敗后才啟用拖拽pan
    [imgV addGestureRecognizer:swipe];

掃動(dòng)識別器的方法

//掃動(dòng)的動(dòng)畫
-(void)swipeAction:(UISwipeGestureRecognizer *)sender
{
    //掃動(dòng)時(shí)操作把圖定位在(0,0)位置,圖大小(250,250)
    [UIView animateWithDuration:1 animations:^{
        sender.view.frame=CGRectMake(0, 0, 250, 250);
    }];
}

-UIPanGestureRecognizer (拖動(dòng)識別器)

創(chuàng)建拖動(dòng)識別器

//---------------創(chuàng)建拖拽手勢
    UIPanGestureRecognizer *pan=[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panAction:)];
    //添加拖拽
    [imgV addGestureRecognizer:pan];

拖動(dòng)識別的方法

//拖動(dòng)手勢的方法
-(void)panAction:(UIPanGestureRecognizer *)sender
{
    //獲取手勢在屏幕上拖動(dòng)的點(diǎn)
    CGPoint p=[sender translationInView:sender.self.view];
    //設(shè)置中心點(diǎn)
    sender.view.center=CGPointMake(sender.view.center.x+p.x, sender.view.center.y+p.y);
    //設(shè)置視圖在父視圖上拖拽的位置
    [sender setTranslation:CGPointZero inView:sender.self.view];//用來設(shè)置勻速運(yùn)動(dòng)
}

-UILongPressGestureRecognizer(長按識別器)

創(chuàng)建長按識別器

   //---------------創(chuàng)建添加長按識別器
    UILongPressGestureRecognizer *longPress=[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressAction:)];
    //添加長按的動(dòng)畫
    [imgV addGestureRecognizer:longPress];

長按識別器的方法

//長按的方法
-(void)longPressAction:(UILongPressGestureRecognizer *)sender
{
    //判斷開始按下
    if (sender.state==UIGestureRecognizerStateBegan)
    {
        UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"提示" message:@"確定刪除" delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:@"取消", nil];
        //顯示提示框
        [alert show];
    }
}

-UIScreenEdgePanGestureRecognizer (右滑返回識別器)

此為iOS7中新添加的屬性
創(chuàng)建右滑動(dòng)返回識別器

//---------------創(chuàng)建添加右滑返回識別器
    UIScreenEdgePanGestureRecognizer *edgePan=[[UIScreenEdgePanGestureRecognizer alloc]initWithTarget:self action:@selector(edgePanAction:)];
    //設(shè)置滑動(dòng)的方式,為右滑動(dòng)
    edgePan.edges=UIRectEdgeLeft;
    [self.view addGestureRecognizer:edgePan];

右滑返回識別的方法

//右滑返回識別的方法
-(void)edgePanAction:(UIScreenEdgePanGestureRecognizer *)sender
{
    NSLog(@"實(shí)現(xiàn)了右滑動(dòng)返回操作");
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市澈魄,隨后出現(xiàn)的幾起案子景鼠,更是在濱河造成了極大的恐慌,老刑警劉巖痹扇,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铛漓,死亡現(xiàn)場離奇詭異,居然都是意外死亡鲫构,警方通過查閱死者的電腦和手機(jī)浓恶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來结笨,“玉大人包晰,你說我怎么就攤上這事湿镀。” “怎么了伐憾?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵勉痴,是天一觀的道長。 經(jīng)常有香客問我树肃,道長蒸矛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任胸嘴,我火速辦了婚禮雏掠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘筛谚。我一直安慰自己,他們只是感情好停忿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布驾讲。 她就那樣靜靜地躺著,像睡著了一般席赂。 火紅的嫁衣襯著肌膚如雪吮铭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天颅停,我揣著相機(jī)與錄音谓晌,去河邊找鬼。 笑死癞揉,一個(gè)胖子當(dāng)著我的面吹牛纸肉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播喊熟,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼柏肪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了芥牌?” 一聲冷哼從身側(cè)響起烦味,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壁拉,沒想到半個(gè)月后谬俄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弃理,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年溃论,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痘昌。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蔬芥,死狀恐怖梆靖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情笔诵,我是刑警寧澤返吻,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站乎婿,受9級特大地震影響测僵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谢翎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一捍靠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧森逮,春花似錦榨婆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至闷供,卻和暖如春烟央,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歪脏。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工疑俭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人婿失。 一個(gè)月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓钞艇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親豪硅。 傳聞我的和親對象是個(gè)殘疾皇子香璃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 好奇觸摸事件是如何從屏幕轉(zhuǎn)移到APP內(nèi)的?困惑于Cell怎么突然不能點(diǎn)擊了舟误?糾結(jié)于如何實(shí)現(xiàn)這個(gè)奇葩響應(yīng)需求葡秒?亦或是...
    Lotheve閱讀 57,181評論 51 599
  • 在iOS開發(fā)中經(jīng)常會(huì)涉及到觸摸事件。本想自己總結(jié)一下嵌溢,但是遇到了這篇文章眯牧,感覺總結(jié)的已經(jīng)很到位,特此轉(zhuǎn)載赖草。作者:L...
    WQ_UESTC閱讀 6,013評論 4 26
  • 手勢識別器是附加到視圖的對象学少,將低級別事件處理代碼轉(zhuǎn)換為更高級別的操作,它允許視圖以控件執(zhí)行的方式響應(yīng)操作秧骑。 手勢...
    坤坤同學(xué)閱讀 4,086評論 0 9
  • -- iOS事件全面解析 概覽 iPhone的成功很大一部分得益于它多點(diǎn)觸摸的強(qiáng)大功能吓蘑,喬布斯讓人們認(rèn)識到手機(jī)其實(shí)...
    翹楚iOS9閱讀 2,961評論 0 13
  • 概覽iPhone的成功很大一部分得益于它多點(diǎn)觸摸的強(qiáng)大功能伟叛,喬布斯讓人們認(rèn)識到手機(jī)其實(shí)是可以不用按鍵和手寫筆直接操...
    紙簡書生閱讀 1,445評論 0 6