iOS開發(fā)之手勢(shì)事件(UiGestureRecognizer)

我們?cè)陂_發(fā)過(guò)程中為了提高用戶體驗(yàn),以及實(shí)現(xiàn)更好的用戶交互往往會(huì)使用UiGestureRecognizer(手勢(shì)識(shí)別器)這一類

其實(shí)UiGestureRecognizer這一類并不復(fù)雜,簡(jiǎn)單來(lái)說(shuō)這就是一個(gè)特殊的觸摸事件,UiGestureRecognizer是一個(gè)父類,而實(shí)際操作中我們要使用它的子類,較為常用的有以下幾種:

UITapGestureRecognizer 輕拍手勢(shì)
UISwipeGestureRecognizer 輕掃手勢(shì)
UILongPressGestureRecognizer 長(zhǎng)按手勢(shì)
UIPanGestureRecognizer 平移手勢(shì)
UIPinchGestureRecognizer 捏合(縮放)手勢(shì)
UIRotationGestureRecognizer 旋轉(zhuǎn)手勢(shì)
UIScreenEdgePanGestureRecognizer 屏幕邊緣平移

UITapGestureRecognizer(輕拍手勢(shì))

手勢(shì)的用法大同小異,我們以UITapGestureRecognizer(輕拍手勢(shì))為例
首先我們?cè)趘iewDidLoad中建立一個(gè)測(cè)試View

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    
    _testView = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 314, 500)];
    _testView.backgroundColor = [UIColor orangeColor];
    
    [self.view addSubview:_testView];
}

效果如圖:


創(chuàng)建testView

接下來(lái)我們需要在viewDidLoad方法中給這個(gè)view添加手勢(shì)

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

實(shí)現(xiàn)觸發(fā)事件,此處觸發(fā)的事件是改變testView的顏色

#pragma mark --- UITapGestureRecognizer 輕拍手勢(shì)事件 ---

-(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];
}

實(shí)現(xiàn)的效果如下

點(diǎn)擊后顏色改變

UISwipeGestureRecognizer (輕掃手勢(shì))

我們?nèi)匀皇褂胻estView這一場(chǎng)景

//創(chuàng)建手勢(shì)
  UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeView:)];
//設(shè)置屬性讨彼,swipe也是有兩種屬性設(shè)置手指?jìng)€(gè)數(shù)及輕掃方向
swipe.numberOfTouchesRequired = 2;
    //設(shè)置輕掃方向(默認(rèn)是從左往右)
    //direction是一個(gè)枚舉值有四個(gè)選項(xiàng)财边,我們可以設(shè)置從左往右,從右往左点骑,從下往上以及從上往下
  //設(shè)置輕掃方向(默認(rèn)是從左往右)
    swipe.direction = UISwipeGestureRecognizerDirectionLeft;
//    [_redView addGestureRecognizer:swipe];

觸發(fā)的事件為:

#pragma mark swipe輕掃手勢(shì)事件
-(void)swipeView:(UISwipeGestureRecognizer *)sender{
    _testView.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];
}

UILongPressGestureRecognizer(長(zhǎng)按手勢(shì))

 UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPress:)];
    //屬性設(shè)置
    //最小長(zhǎng)按時(shí)間
    longPress.minimumPressDuration = 2;
        [_testView addGestureRecognizer:longPress];

觸發(fā)事件:

#pragma mark langPress 長(zhǎng)按手勢(shì)事件
-(void)longPress:(UILongPressGestureRecognizer *)sender{
    //進(jìn)行判斷,在什么時(shí)候觸發(fā)事件
    if (sender.state == UIGestureRecognizerStateBegan) {
        NSLog(@"長(zhǎng)按狀態(tài)");
//改變testView顏色
        _testView.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];
    }
}

UIPanGestureRecognizer(平移手勢(shì))

創(chuàng)建手勢(shì)

 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panView:)];
    
 [_testView addGestureRecognizer:pan];

觸發(fā)事件

#pragma mark pan   平移手勢(shì)事件
-(void)panView:(UIPanGestureRecognizer *)sender{
    CGPoint point = [sender translationInView:_testView];
//    sender.view.transform = CGAffineTransformMake(1, 0, 0, 1, point.x, point.y);
    
//平移一共兩種移動(dòng)方式
 //第一種移動(dòng)方法:每次移動(dòng)都是從原來(lái)的位置移動(dòng)
//    sender.view.transform = CGAffineTransformMakeTranslation(point.x, point.y);
    
    //第二種移動(dòng)方式:以上次的位置為標(biāo)準(zhǔn)(移動(dòng)方式 第二次移動(dòng)加上第一次移動(dòng)量)
    sender.view.transform = CGAffineTransformTranslate(sender.view.transform, point.x, point.y);
    //增量置為o
    [sender setTranslation:CGPointZero inView:sender.view];
    
     _testView.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];
    
}

UIScreenEdgePanGestureRecognizer(屏幕邊緣平移手勢(shì))

創(chuàng)建手勢(shì)

    UIScreenEdgePanGestureRecognizer *screenEdgePan = [[UIScreenEdgePanGestureRecognizer alloc]initWithTarget:self action:@selector(screenEdgePanView:)];

    //注意:,使用屏幕邊界平移手勢(shì),需要注意兩點(diǎn)
    //1. 視圖位置(屏幕邊緣)
    //2. 設(shè)置edges屬性
     // 設(shè)置屏幕邊緣手勢(shì)支持方法
    screenEdgePan.edges = UIRectEdgeLeft;
    //屬性設(shè)置
  [_testView addGestureRecognizer:screenEdgePan];

觸發(fā)事件

#pragma mark screenEdgePan 屏幕邊界平移事件
-(void)screenEdgePanView:(UIScreenEdgePanGestureRecognizer *)sender{
    
    //計(jì)算偏移量
    CGPoint point = [sender translationInView:_testView];
    //進(jìn)行平移
    sender.view.transform = CGAffineTransformMakeTranslation(point.x, point.y);
    
}

UIPinchGestureRecognizer(捏合手勢(shì))

創(chuàng)建手勢(shì)

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

觸發(fā)事件

#pragma mark pinch 捏合手勢(shì)事件
-(void)pinchView:(UIPinchGestureRecognizer *)sender{
    //scale 縮放比例
//    sender.view.transform = CGAffineTransformMake(sender.scale, 0, 0, sender.scale, 0, 0);
    //每次縮放以原來(lái)位置為標(biāo)準(zhǔn)
//    sender.view.transform = CGAffineTransformMakeScale(sender.scale, sender.scale);
   
    //每次縮放以上一次為標(biāo)準(zhǔn)
    sender.view.transform = CGAffineTransformScale(sender.view.transform, sender.scale, sender.scale);
    //重新設(shè)置縮放比例 1是正澈眩縮放.小于1時(shí)是縮小(無(wú)論何種操作都是縮小),大于1時(shí)是放大(無(wú)論何種操作都是放大)
    sender.scale = 1;
   
}

UIRotationGestureRecognizer(旋轉(zhuǎn)手勢(shì))

創(chuàng)建手勢(shì)

 UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationView:)];
    
 [_testView addGestureRecognizer:rotation];

觸發(fā)事件

-(void)rotationView:(UIRotationGestureRecognizer *)sender{
//    sender.view.transform = CGAffineTransformMake(cos(M_PI_4), sin(M_PI_4), -sin(M_PI_4), cos(M_PI_4), 0, 0);
    //捏合手勢(shì)兩種改變方式
    //以原來(lái)的位置為標(biāo)準(zhǔn)
//    sender.view.transform = CGAffineTransformMakeRotation(sender.rotation);//rotation 是旋轉(zhuǎn)角度
    
    //兩個(gè)參數(shù),以上位置為標(biāo)準(zhǔn)
    sender.view.transform = CGAffineTransformRotate(sender.view.transform, sender.rotation);
    //消除增量
    sender.rotation = 0.0;
    
}

合理的運(yùn)用手勢(shì)會(huì)使我們的app擁有更好的體驗(yàn),但是在使用手勢(shì)的同時(shí)也要注意避免手勢(shì)和手勢(shì)間黑滴,以及手勢(shì)和其他控件間的沖突憨募。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市袁辈,隨后出現(xiàn)的幾起案子菜谣,更是在濱河造成了極大的恐慌,老刑警劉巖晚缩,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尾膊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡荞彼,警方通過(guò)查閱死者的電腦和手機(jī)冈敛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鸣皂,“玉大人抓谴,你說(shuō)我怎么就攤上這事∧欤” “怎么了癌压?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)荆陆。 經(jīng)常有香客問(wèn)我滩届,道長(zhǎng),這世上最難降的妖魔是什么被啼? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任帜消,我火速辦了婚禮,結(jié)果婚禮上趟据,老公的妹妹穿的比我還像新娘券犁。我一直安慰自己术健,他們只是感情好汹碱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荞估,像睡著了一般咳促。 火紅的嫁衣襯著肌膚如雪稚新。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天跪腹,我揣著相機(jī)與錄音褂删,去河邊找鬼。 笑死冲茸,一個(gè)胖子當(dāng)著我的面吹牛屯阀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播轴术,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼难衰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了逗栽?” 一聲冷哼從身側(cè)響起盖袭,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎彼宠,沒(méi)想到半個(gè)月后鳄虱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凭峡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年拙已,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摧冀。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悠栓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出按价,到底是詐尸還是另有隱情惭适,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布楼镐,位于F島的核電站癞志,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏框产。R本人自食惡果不足惜凄杯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秉宿。 院中可真熱鬧戒突,春花似錦、人聲如沸描睦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至隔崎,卻和暖如春今艺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爵卒。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工虚缎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钓株。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓实牡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親轴合。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铲掐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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