手勢識別

通過touches方法監(jiān)聽view觸摸事件有以下幾個缺點

  • 1.必須得自定義view,在自定義的View當中去實現(xiàn)touches方法.
    2.由于是在view內(nèi)部的touches方法中監(jiān)聽觸摸事件,因此默認情況下,無法讓其他外界對象監(jiān)聽view的觸摸事件
    3.不容易區(qū)分用戶的具體手勢行為(不容易區(qū)分是長按手勢,還是縮放手勢)這些等.

  • iOS 3.2之后芳撒,蘋果推出了手勢識別功能(Gesture Recognizer在觸摸事件處理方面大大簡化了開發(fā)者的開發(fā)難度

    UIGestureRecognizer手勢識別器
    利用UIGestureRecognizer,能輕松識別用戶在某個view上面做的一些常見手勢
    UIGestureRecognizer是一個抽象類暗甥,定義了所有手勢的基本行為柱查,使用它的子類才能處理具體的手勢

  • 注意手勢有以下幾種:

    UITapGestureRecognizer(敲擊)
    UIPinchGestureRecognizer(捏合,用于縮放)
    UIPanGestureRecognizer(拖拽)
    UISwipeGestureRecognizer(輕掃)
    UIRotationGestureRecognizer(旋轉(zhuǎn))
    UILongPressGestureRecognizer(長按)
  • 手勢使用方法:
    1.創(chuàng)建手勢
    2.添加手勢
    3.實現(xiàn)手勢方法

1.添加點按手勢

  • 創(chuàng)建手勢
        Target:當哪對象要堅聽手勢
        action:手勢發(fā)生時調(diào)用的方法
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self 
                                                                        action:@selector(tap)];
        手勢也可以設置代理
        tap.delegate = self;
        添加手勢
        [self.imageV addGestureRecognizer:tap];
  • 以下為手勢代理方法:
    是否允許接收手指.
    當返回為yes的時候,表示能夠接收手指,當為No的時候,表示不能夠接收手指,也就是不能夠接收事件.
        -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:
        (UITouch *)touch{
            獲取當前手指所在的點
           CGPoint curP =  [touch locationInView:self.imageV];
            if (curP.x > self.imageV.bounds.size.width * 0.5) {
                在右邊,返回NO
                return NO;
            }else{
                 在左邊,返回yes,
                return YES;
            }
        }

2.添加長按手勢

        UILongPressGestureRecognizer *longP = [[UILongPressGestureRecognizer alloc] 
                                    initWithTarget:self action:@selector(longPress:)];
        添加手勢
        [self.imageV addGestureRecognizer:longP];
  • 當手指長按時調(diào)用
    注意,長按手勢會調(diào)用多次,當開始長按時會調(diào)用,當長按松開時會調(diào)用,當長按移動時, 也會調(diào)用.
    一般我們都是在長按剛開始時做事情,所以要判斷它的狀態(tài).
    這個狀態(tài)是保存的當前的手勢當中, 所以要把當前的長按手勢傳進來, 來判斷當前手勢的狀態(tài).
        - (void)longPress:(UILongPressGestureRecognizer *)longP{
            手勢的狀態(tài)是一個枚舉UIGestureRecognizerState,可以進入頭文件當中查看.
            if (longP.state == UIGestureRecognizerStateBegan) {
                NSLog(@"開始長按時調(diào)用");
            }else if(longP.state == UIGestureRecognizerStateChanged){
                會持續(xù)調(diào)用
                NSLog(@"當長按拖動時調(diào)用");
            }else if(longP.state == UIGestureRecognizerStateEnded){
                NSLog(@"當長按松手指松開進調(diào)用");
            }
        }

3.輕掃手勢

        UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] 
                                initWithTarget:self action:@selector(swipe:)];
        注意:輕掃手勢默認輕掃的方向是往右輕掃,可以去手動修改輕掃的方向
        一個手勢只能對象一個方向,想要支持多個方向的輕掃,要添加多個輕掃手勢
        swipe.direction = UISwipeGestureRecognizerDirectionLeft;
        添加手勢
        [self.imageV addGestureRecognizer:swipe];
        
        再添加一個輕掃手勢
        輕掃手勢
        UISwipeGestureRecognizer *swipe2 = [[UISwipeGestureRecognizer alloc] 
                                initWithTarget:self action:@selector(swipe:)];
    注意:輕掃手勢默認輕掃的方向是往右輕掃,可以去手動修改輕掃的方向
    一個手勢只能對象一個方向,想要支持多個方向的輕掃,要添加多個輕掃手勢
    swipe2.direction = UISwipeGestureRecognizerDirectionDown;
    添加手勢
    [self.imageV addGestureRecognizer:swipe2];
  • 輕掃手勢的方向
UISwipeGestureRecognizerDirectionRight = 1 << 0,(右)
    UISwipeGestureRecognizerDirectionLeft  = 1 << 1,(左)
    UISwipeGestureRecognizerDirectionUp    = 1 << 2,(上)
    UISwipeGestureRecognizerDirectionDown  = 1 << 3(下)

1.平移

 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self
                                                                    action:@selector(pan:)];
           添加手勢
          [self.imageV addGestureRecognizer:pan];
          
          實現(xiàn)手勢方法
           手指在屏幕上移動進調(diào)用
            - (void)pan:(UIPanGestureRecognizer *)pan{
                獲取當前手指移動的偏移量
                CGPoint transP =  [pan translationInView:self.imageV];
                NSLog(@"%@",NSStringFromCGPoint(transP));
                Make它會清空上一次的形變.
                self.imageV.transform = CGAffineTransformMakeTranslation(transP.x, transP.y);
                
                self.imageV.transform = CGAffineTransformTranslate(self.imageV.transform, 
                                                                           transP.x, transP.y);
                復位,相對于上一次.
                [pan  setTranslation:CGPointZero inView:self.imageV];
            }

2.旋轉(zhuǎn)

        添加旋轉(zhuǎn)手勢
        UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] 
                                     initWithTarget:self action:@selector(rotation:)];
        設置代理,設置代理的目的就讓它能夠同時支持旋轉(zhuǎn)跟縮放
        rotation.delegate = self;
        添加手勢
        [self.imageV addGestureRecognizer:rotation];
        
        
        當旋轉(zhuǎn)時調(diào)用
        - (void)rotation:(UIRotationGestureRecognizer *)rotation{
            旋轉(zhuǎn)也是相對于上一次
            self.imageV.transform = CGAffineTransformRotate(self.imageV.transform, 
                                                                 rotation.rotation);
            設置代理,設置代理的目的就讓它能夠同時支持旋轉(zhuǎn)跟縮放
            rotation.delegate = self;
            也要做復位操作
            rotation.rotation = 0;
        }

3.添加縮放手勢

添加縮放手勢

        UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc]                                             initWithTarget:self action:@selector(pinch:)];
        
       [self.imageV addGestureRecognizer:pinch];

        
        縮放手勢時調(diào)用
        -(void)pinch:(UIPinchGestureRecognizer *)pinch{
            平移也是相對于上一次
            self.imageV.transform = CGAffineTransformScale(self.imageV.transform, pinch.scale, 
                                                                                  pinch.scale);
            復位
            pinch.scale = 1;
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末会宪,一起剝皮案震驚了整個濱河市逻悠,隨后出現(xiàn)的幾起案子元践,更是在濱河造成了極大的恐慌,老刑警劉巖童谒,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件单旁,死亡現(xiàn)場離奇詭異,居然都是意外死亡饥伊,警方通過查閱死者的電腦和手機象浑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撵渡,“玉大人融柬,你說我怎么就攤上這事∏骶啵” “怎么了粒氧?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長节腐。 經(jīng)常有香客問我外盯,道長摘盆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任饱苟,我火速辦了婚禮孩擂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘箱熬。我一直安慰自己类垦,他們只是感情好,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布城须。 她就那樣靜靜地躺著蚤认,像睡著了一般。 火紅的嫁衣襯著肌膚如雪糕伐。 梳的紋絲不亂的頭發(fā)上砰琢,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音良瞧,去河邊找鬼陪汽。 笑死,一個胖子當著我的面吹牛褥蚯,可吹牛的內(nèi)容都是我干的挚冤。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼遵岩,長吁一口氣:“原來是場噩夢啊……” “哼你辣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起尘执,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宴凉,沒想到半個月后誊锭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡弥锄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年丧靡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片籽暇。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡温治,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出戒悠,到底是詐尸還是另有隱情熬荆,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布绸狐,位于F島的核電站卤恳,受9級特大地震影響累盗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜突琳,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一若债、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拆融,春花似錦蠢琳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逛艰,卻和暖如春躏碳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背散怖。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工菇绵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人镇眷。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓咬最,卻偏偏與公主長得像,于是被迫代替她去往敵國和親欠动。 傳聞我的和親對象是個殘疾皇子永乌,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

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