手勢(shì)識(shí)別

監(jiān)聽(tīng)觸摸事件的做法

  • 如果想監(jiān)聽(tīng)一個(gè)view上面的觸摸事件,之前的做法是
    1.自定義一個(gè)view
    2.實(shí)現(xiàn)view的touches方法,在方法內(nèi)部實(shí)現(xiàn)具體處理代碼
  • 注意:通過(guò)touches方法監(jiān)聽(tīng)view觸摸事件,有很明顯的幾個(gè)缺點(diǎn)
    1.必須得自定義view
    2.由于是在view內(nèi)部的touches方法中監(jiān)聽(tīng)觸摸事件,因此默認(rèn)情況下,無(wú)法讓其他外界對(duì)象監(jiān)聽(tīng)view的觸摸事件
    3.不容易區(qū)分用戶的具體手勢(shì)行為
  • iOS 3.2之后,蘋(píng)果推出了手勢(shì)識(shí)別功能(Gesture Recognizer),在觸摸事件處理方面,大大簡(jiǎn)化了開(kāi)發(fā)者的開(kāi)發(fā)難度

UIGestureRecognizer的使用

 1.什么是UIGestureRecognizer:
       UIGestureRecognizer手勢(shì)識(shí)別器
  2.優(yōu)點(diǎn) :
       利用UIGestureRecognizer,能輕松識(shí)別用戶在某個(gè)view上面做的一些常見(jiàn)手勢(shì)
  3.注意點(diǎn):
      UIGestureRecognizer是一個(gè)抽象類(lèi),定義了所有手勢(shì)的基本行為,使用它的子類(lèi)才能處理具體的手勢(shì)
  4.UIGestureRecognizer的子類(lèi)
        UITapGestureRecognizer(敲擊)
        UIPinchGestureRecognizer(捏合,用于縮放)
        UIPanGestureRecognizer(拖拽)
        UISwipeGestureRecognizer(輕掃)
        UIRotationGestureRecognizer(旋轉(zhuǎn))
        UILongPressGestureRecognizer(長(zhǎng)按)

手勢(shì)的使用

注意:在使用手勢(shì)時(shí),涉及到形變的手勢(shì),不能使用make的transform方法
//self.imageV.transform = CGAffineTransformMakeTranslation(point.x, point.y);
因?yàn)楫?dāng)移動(dòng)完畢后,在次點(diǎn)擊拖動(dòng)時(shí),圖片會(huì)回到最開(kāi)始的位置,make的transform方法是相對(duì)于最原始的位置進(jìn)行形變的而且只會(huì)執(zhí)行一次,所以在拖動(dòng)的時(shí)候,總是會(huì)回到起始點(diǎn)后,所以在拖動(dòng)過(guò)程中,就會(huì)出現(xiàn)震顫的效果;
可以使用沒(méi)有make的transform方法
self.imageV.transform = CGAffineTransformTranslate(self.imageV.transform, point.x, point.y);
因?yàn)檫@個(gè)方法的形變值,是相對(duì)上一次而非最初的狀態(tài)的形變值,因此獲取相對(duì)最初位置的偏移量是累加了之前的偏移量的值,獲取到的偏移值會(huì)比實(shí)際的偏移值大很多,但是需要的偏移量是要相對(duì)圖片最初位置的偏移量,所以,在這里需要調(diào)用setTranslation: inView:方法,在拖動(dòng)時(shí),將上一次的偏移值清空,以獲取拖動(dòng)時(shí)相對(duì)初始位置的偏移值.

  • 1.UITapGestureRecognizer(敲擊)
    /*************手勢(shì)點(diǎn)按*************/
-(void)tapTestGes{
    //創(chuàng)建手勢(shì)
    UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGes)];//當(dāng)圖片沒(méi)有接受到手勢(shì)的觸摸事件后,不會(huì)調(diào)用tap方法
    //給圖片添加手勢(shì)
    [self.imageV addGestureRecognizer:tap];
}
//手勢(shì)的方法
-(void)tapGes{
    NSLog(@"%s",__func__);
}
  • 2.UIPinchGestureRecognizer(捏合,用于縮放)
    /*************捏合手勢(shì)*************/
-(void)pinchGes{
    UIPinchGestureRecognizer * pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGes:)];
    pinch.delegate = self;
    [self.imageV addGestureRecognizer:pinch];
}
//捏合手勢(shì)的方法
-(void)pinchGes:(UIPinchGestureRecognizer *)pinch
{
    self.imageV.transform = CGAffineTransformScale(self.imageV.transform, pinch.scale, pinch.scale);//如果縮放倍數(shù)寫(xiě)成常數(shù),那么久只能放大或縮小
    [pinch setScale:1];
}
  • 3.UIPanGestureRecognizer(拖拽)
    /*************拖動(dòng)手勢(shì)*************/
-(void)panGes{
    UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGes:)];
    [self.imageV addGestureRecognizer:pan];
}
//平移圖片
-(void)panGes:(UIPanGestureRecognizer *)pan
{
    //獲取圖片相對(duì)最開(kāi)始時(shí)的自己的位置
    CGPoint point = [pan translationInView:self.imageV];
    self.imageV.transform = CGAffineTransformTranslate(self.imageV.transform, point.x, point.y);
    //重置圖片的移動(dòng)距離(相對(duì)于上一次)
        NSLog(@"%@",NSStringFromCGPoint(point));
    [pan setTranslation:CGPointZero inView:self.imageV];
}
  • 4.UISwipeGestureRecognizer(輕掃)
    //設(shè)置輕掃方向
    1.只有在同一水平方向上的手勢(shì)可以拼接,不在同一水平方向上的手勢(shì)不可以拼接
    2.拼接以后只能識(shí)別圖片被輕掃了,但不能識(shí)別往哪個(gè)方向輕掃
    3.要想識(shí)別圖片是往哪個(gè)方向輕掃了,需要添加兩個(gè)輕掃手勢(shì)對(duì)象,其中一個(gè)手勢(shì)對(duì)象必須指明要滑動(dòng)的方向
    /*************輕掃手勢(shì)*************/
-(void)swipeGes{
    //創(chuàng)建輕掃手勢(shì)
    UISwipeGestureRecognizer * swipe1 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGes:)];
    //設(shè)置輕掃方向
    swipe1.direction =  UISwipeGestureRecognizerDirectionLeft;
    //給圖片添加輕掃手勢(shì)
    [self.imageV addGestureRecognizer:swipe1];
    //創(chuàng)建第二個(gè)輕掃手勢(shì)
    UISwipeGestureRecognizer * swipe2 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGes:)];
    //給圖片添加第二個(gè)輕掃手勢(shì)
    [self.imageV addGestureRecognizer:swipe2];
}
//輕掃手勢(shì)方法的實(shí)現(xiàn)
-(void)swipeGes:(UISwipeGestureRecognizer *)swipe
{
    if (swipe.direction == UISwipeGestureRecognizerDirectionLeft) {
        NSLog(@"向左輕掃圖片");
    }else if (swipe.direction == UISwipeGestureRecognizerDirectionRight){
        NSLog(@"向右輕掃圖片");
    }else{
    NSLog(@"無(wú)法識(shí)別輕掃圖片的方向");
    }
}
  • 5.UIRotationGestureRecognizer(旋轉(zhuǎn))
    /*************旋轉(zhuǎn)手勢(shì)*************/
-(void)rotationGes{
    UIRotationGestureRecognizer * rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationGes:)];
    rotation.delegate = self;
    [self.imageV addGestureRecognizer:rotation];
}
//旋轉(zhuǎn)手勢(shì)的方法
-(void)rotationGes:(UIRotationGestureRecognizer *)rotation
{
    self.imageV.transform = CGAffineTransformRotate(self.imageV.transform, rotation.rotation);
    [rotation setRotation:0];
}
  • 6.UILongPressGestureRecognizer(長(zhǎng)按)
    /*************手勢(shì)長(zhǎng)按*************/
-(void)longPressGes
{
    //創(chuàng)建長(zhǎng)按手勢(shì)
    UILongPressGestureRecognizer * longP = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPGes:)];
    //給圖片添加長(zhǎng)按手勢(shì)
    [self.imageV addGestureRecognizer:longP];
}
//當(dāng)長(zhǎng)按的時(shí)候會(huì)調(diào)用此方法
-(void)longPGes:(UILongPressGestureRecognizer *)longP
{
    //判斷長(zhǎng)按手勢(shì)的狀態(tài).因此,方法應(yīng)該傳入長(zhǎng)按手勢(shì)對(duì)象
    if (longP.state == UIGestureRecognizerStateBegan) {
        NSLog(@"開(kāi)始長(zhǎng)按");
    }else if (longP.state == UIGestureRecognizerStateChanged){
        NSLog(@"開(kāi)始滑動(dòng)");
    }else if (longP.state == UIGestureRecognizerStateEnded){
        NSLog(@"結(jié)束長(zhǎng)按");
    }
}
  • 設(shè)置是否允許手指觸摸,需要設(shè)置代理,并實(shí)現(xiàn)下面的代理方法
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    //獲取當(dāng)前觸摸點(diǎn)的位置
    CGPoint curP = [touch locationInView:self.imageV];
    //設(shè)置可觸摸的范圍(左側(cè)不可觸摸,右側(cè)可以觸摸)
    if (curP.x <= self.imageV.frame.size.width * 0.5) {
        NSLog(@"%@",NSStringFromCGPoint(curP));
        NSLog(@"不可以觸摸");
        return NO;
    }else{
        NSLog(@"%@",NSStringFromCGPoint(curP));
        NSLog(@"可以觸摸");
        return YES;
    }
  • 設(shè)置是否允許接受多個(gè)手勢(shì),設(shè)置對(duì)應(yīng)手勢(shì)的代理,并實(shí)現(xiàn)下面的dialing方法
//實(shí)現(xiàn)代理方法
//同時(shí)執(zhí)行多個(gè)手勢(shì)操作
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容