IOS開發(fā)基礎(chǔ):手勢事件(UiGestureRecognizer)

在介紹之前,咱們首先要知道為什么要用手勢。比如我們需要添加一些觸屏敲茄、滑屏事件位谋,比如捏合圖片、雙擊屏幕掏父、下拉視圖等等,就會用到手勢

一损同、手勢(UIGestureRecognizer)的種類

其實(shí)UIGestureRecognizer這一類并不復(fù)雜,簡單來說這就是一個特殊的觸摸事件,UIGestureRecognizer是一個父類,而實(shí)際操作中我們要使用它的子類,鸟款、大概有以下幾種:

子類名稱 名稱
UITapGestureRecognizer 輕拍手勢
UISwipeGestureRecognizer 輕掃手勢
UILongPressGestureRecognizer 長按手勢
UIPanGestureRecognizer 平移手勢
UIPinchGestureRecognizer 捏合(縮放)手勢
UIRotationGestureRecognizer 旋轉(zhuǎn)手勢
UIScreenEdgePanGestureRecognizer 屏幕邊緣平移
UISharkGestureRecognizer 晃動

二、創(chuàng)建手勢

手勢的創(chuàng)建的方法大同小異

  • UITapGestureRecognizer(輕拍手勢)
//創(chuàng)建手勢 使用initWithTarget:action:的方法創(chuàng)建
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapView:)];
    
    //設(shè)置屬性
    //tap 手勢一共兩個屬性组哩,一個是設(shè)置輕拍次數(shù),一個是設(shè)置點(diǎn)擊手指個數(shù)
    //設(shè)置輕拍次數(shù)
    tap.numberOfTapsRequired = 2;
    //設(shè)置手指字?jǐn)?shù)
    tap.numberOfTouchesRequired = 2;
    
    //別忘了添加到testView上
    [self.view addGestureRecognizer:tap];

-(void)tapView:(UITapGestureRecognizer *)sender{
    //設(shè)置輕拍事件改變testView的顏色
    _testView.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];
}
  • UISwipeGestureRecognizer (輕掃手勢)
//創(chuàng)建手勢
UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeView:)];
//設(shè)置屬性伶贰,swipe也是有兩種屬性設(shè)置手指個數(shù)及輕掃方向
swipe.numberOfTouchesRequired = 2;
    //設(shè)置輕掃方向(默認(rèn)是從左往右)
    //direction是一個枚舉值有四個選項(xiàng)罐栈,我們可以設(shè)置從左往右,從右往左荠诬,從下往上以及從上往下
  //設(shè)置輕掃方向(默認(rèn)是從左往右)
swipe.direction = UISwipeGestureRecognizerDirectionLeft;
[self.view addGestureRecognizer:swipe];


- (void)swipeView:(UISwipeGestureRecognizer *)sender {
    self.view.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];
   //可在這里獲取手勢位置
}
  • UILongPressGestureRecognizer(長按手勢)
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPress:)];
    //屬性設(shè)置
    //最小長按時間
    longPress.minimumPressDuration = 2;
        [self.view addGestureRecognizer:longPress];

-(void)longPress:(UILongPressGestureRecognizer *)sender{
    //進(jìn)行判斷,在什么時候觸發(fā)事件
    if (sender.state == UIGestureRecognizerStateBegan) {
        NSLog(@"長按狀態(tài)");
    //改變testView顏色
        self.view.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];
    }
}
  • UIPanGestureRecognizer(拖拽手勢)
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
    [self.imageV addGestureRecognizer:pan];

當(dāng)手指拖動時調(diào)用
- (void)pan:(UIPanGestureRecognizer *)pan{
   
    拖動手勢也有狀態(tài) 
    if(pan.state == UIGestureRecognizerStateBegan){
          開始拖動  
    }else if(pan.state == UIGestureRecognizerStateChanged){
        注意:獲取偏移量是相對于最原始的點(diǎn) 
        CGPoint transP = [pan translationInView:self.imageV];
        self.imageV.transform = CGAffineTransformTranslate(self.imageV.transform, transP.x, transP.y);

        復(fù)位,讓它相對于上一次. 
        [pan setTranslation:CGPointZero inView:self.imageV];
    }else if(pan.state == UIGestureRecognizerStateEnded){
        結(jié)束拖動       
    }
}
  • UIPinchGestureRecognizer(捏合手勢柑贞,用于縮放)
  • UIRotationGestureRecognizer(旋轉(zhuǎn)手勢)
//現(xiàn)在視圖上添加圖片 對圖片進(jìn)行操作
//添加捏合手勢
UIPinchGestureRecognizer *pinGes = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinGes:)];
[self.imageView addGestureRecognizer:pinGes];


旋轉(zhuǎn)時調(diào)用
- (void)pinGes:(UIPinchGestureRecognizer *)pin{
    self.imageView.transform = CGAffineTransformScale(self.imageV.transform, pin.scale, pin.scale);
    復(fù)位 
    [pin setScale:1];
   
}

添加旋轉(zhuǎn)手勢
 UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotation:)];
 設(shè)置代理使其能夠同時支持多個手勢(捏合的時候同時支持旋轉(zhuǎn))
 rotation.delegate = self;
 [self.imageView addGestureRecognizer:rotation];


當(dāng)手指開始旋轉(zhuǎn)時調(diào)用.
- (void)rotation:(UIRotationGestureRecognizer *)rotation{ 
    self.imageView.transform = CGAffineTransformRotate(self.imageV.transform, rotation.rotation);
    復(fù)位. 
    [rotation setRotation:0]; 
}

三钧嘶、手勢的一些代理函數(shù)(UIGestureRecognizerDelegate)

// 是否允許開始觸發(fā)手勢
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;

//手指觸摸屏幕后回調(diào)的方法,返回NO則不再進(jìn)行手勢識別有决,方法觸發(fā)等
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;

//開始進(jìn)行手勢識別時調(diào)用的方法,返回NO則結(jié)束书幕,不再觸發(fā)手勢
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;

//是否支持多時候觸發(fā),返回YES迟隅,則可以多個手勢一起觸發(fā)方法励七,返回NO則為互斥
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

//下面這個兩個方法也是用來控制手勢的互斥執(zhí)行的
//這個方法返回YES,第一個手勢和第二個互斥時掠抬,第一個會失效
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0);

//這個方法返回YES,第一個和第二個互斥時瞳步,第二個會失效
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0);

四腰奋、手勢沖突處理

一般在含有UIScrollView或者UIScrollView的子類的視圖上添加自己的手勢就會有沖突单起;利用UIGestureRecognizerDelegate中的代理方法可以解決相應(yīng)的沖突劣坊;
因?yàn)樵赨IScrollView上有手勢,利用

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
//設(shè)置為YES就可以一直傳遞下去

同時手勢與事件觸摸有優(yōu)先級的關(guān)系测蘑,使用手勢時應(yīng)該多注意

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末康二,一起剝皮案震驚了整個濱河市,隨后出現(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ī)與錄音棍掐,去河邊找鬼拷况。 笑死作煌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杯巨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼获诈!你這毒婦竟也來了心褐?” 一聲冷哼從身側(cè)響起舔涎,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亡嫌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后挟冠,有當(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
  • 正文 我和宋清朗相戀三年控淡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掺炭。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡凭戴,死狀恐怖,靈堂內(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. 我叫王不留锚扎,地道東北人馁启。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像惯疙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子霉颠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

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