六大操作手勢

使用 touches 方法來監(jiān)聽 view 的觸摸事件弊端:

  • 必須得自定義 view, 在自定義的 View 當(dāng)中去實(shí)現(xiàn) touches 方法
  • 由于是在 view 內(nèi)部的 touches 方法中監(jiān)聽觸摸事件措嵌,因此默認(rèn)無法讓其外界對象監(jiān)聽該 view 的觸摸事件
  • 不容易區(qū)分用戶具體的手勢行為

鑒于這些問題,在iOS 3.2 之后对雪,蘋果推出了手勢識別功能(Gesture Recognizer)

  • 利用 UIGestureRecognizer,能輕松識別用戶在某個 view 上面做的一些常見手勢
  • UIGestureRecognizer 是一個抽象類幢哨,定義了所有手勢的基本行為臭增,使用它的子類才能處理具體的手勢
    1. 點(diǎn)按手勢 UITapGestureRecognizer
    2. 長按手勢 UILongPressGestureRecognizer
    3. 拖拽手勢 UIPanGestureRecognizer
    4. 輕掃手勢 UISwipeGestureRecognizer
    5. 旋轉(zhuǎn)手勢 UIRotationGestureRecognizer
    6. 捏合手勢 UIPinchGestureRecognizer

手勢的使用方法

  1. 創(chuàng)建手勢
  2. 添加手勢
  3. 實(shí)現(xiàn)手勢方法
  4. 補(bǔ)充(手勢也可以設(shè)置代理)

代碼示范

點(diǎn)按手勢 UITapGestureRecognizer
- (void)topGes {
    UITapGestureRecognizer *tapGes = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap)];
    tapGes.delegate = self;
    [self.imageView addGestureRecognizer:tapGes];
}
- (void)tap {
    NSLog(@"現(xiàn)在是點(diǎn)按手勢");
}
// 代理方法:是否允許接收手指
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    //讓圖片左邊可以點(diǎn)擊紧显,右邊不能點(diǎn)擊
    CGPoint curP = [touch locationInView:self.imageView];
    if (curP.x > self.imageView.bounds.size.width * 0.5) {
        return NO;
    }else {
        return YES;
    }
}
長按手勢 UILongPressGestureRecognizer
- (void)longPGes {
    UILongPressGestureRecognizer *longPGes = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longP:)];
    [self.imageView addGestureRecognizer:longPGes];
}
//當(dāng)長按并移動時脾还,會多次調(diào)用這個方法
- (void)longP:(UILongPressGestureRecognizer *)longP {
    //判斷長按時的狀態(tài)
    if (longP.state == UIGestureRecognizerStateBegan) {
        NSLog(@"開始長按");
    }else if (longP.state == UIGestureRecognizerStateChanged) {
        NSLog(@"- - - 長按時手指移動了 - - -");
    }else if (longP.state == UIGestureRecognizerStateEnded) {
        NSLog(@"長按結(jié)束");
    }
}
拖拽手勢 UIPanGestureRecognizer
- (void)panGes {
    UIPanGestureRecognizer *panGes = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
    [self.imageView addGestureRecognizer:panGes];
}
- (void)pan:(UIPanGestureRecognizer *)pan {
    //獲取偏移量
    CGPoint transP = [pan translationInView:self.imageView];
    NSLog(@"transP = %@", NSStringFromCGPoint(transP));
 
    //移動圖片
    self.imageView.transform = CGAffineTransformTranslate(self.imageView.transform, transP.x, transP.y);
    //清零,不要累加
    [pan setTranslation:CGPointZero inView:self.imageView];
}
輕掃手勢 UISwipeGestureRecognizer
  • 一個手勢只能對應(yīng)一個方向肥印,若要支持多個方向识椰,可以添加多個手勢
  • 輕掃手勢的方向默認(rèn)是向右
  • 可以通過修改手勢的 direction 屬性修改手勢的方向
- (void)swipeGes {
    //一個手勢只能對應(yīng)一個方向,若要支持多個方向深碱,可以添加多個手勢
    UISwipeGestureRecognizer *swipeGes1 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
    //輕掃手勢的方向默認(rèn)是向右
    [self.imageView addGestureRecognizer:swipeGes1];
    UISwipeGestureRecognizer *swipeGes2 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
    //可以修改手勢的方向腹鹉,向上
    swipeGes2.direction = UISwipeGestureRecognizerDirectionUp;
    [self.imageView addGestureRecognizer:swipeGes2];
    UISwipeGestureRecognizer *swipeGes3 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
    //手勢的方向,向左
    swipeGes3.direction =  UISwipeGestureRecognizerDirectionLeft;
    [self.imageView addGestureRecognizer:swipeGes3];
    UISwipeGestureRecognizer *swipeGes4 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
    //手勢的方向敷硅,向下
    swipeGes4.direction = UISwipeGestureRecognizerDirectionDown;
    [self.imageView addGestureRecognizer:swipeGes4];
}
- (void)swipe:(UISwipeGestureRecognizer *)swipe {
    if (swipe.direction == UISwipeGestureRecognizerDirectionLeft) {
        NSLog(@"向左輕掃 --- left");
    }else if (swipe.direction == UISwipeGestureRecognizerDirectionRight){
        NSLog(@"向右輕掃 --- right");
    }else if (swipe.direction == UISwipeGestureRecognizerDirectionUp){
        NSLog(@"向上輕掃 --- up");
    } else if (swipe.direction == UISwipeGestureRecognizerDirectionDown) {
        NSLog(@"向下輕掃 --- down");
    }
}
旋轉(zhuǎn)手勢 UIRotationGestureRecognizer
- (void)rotationGes {
    UIRotationGestureRecognizer *rotationGes = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotation:)];
    [self.imageView addGestureRecognizer:rotationGes];
}
 
- (void)rotation:(UIRotationGestureRecognizer *)rotationGes {
    //獲取旋轉(zhuǎn)的度數(shù)
    CGFloat angle = rotationGes.rotation;
    //旋轉(zhuǎn)圖片
    self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, angle);
    //清零
    [rotationGes setRotation:0];
}
捏合手勢 UIPinchGestureRecognizer
- (void)pinchGes {
    UIPinchGestureRecognizer *pinchGes = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
    [self.imageView addGestureRecognizer:pinchGes];
}
- (void)pinch:(UIPinchGestureRecognizer *)pinchGes {
    //獲取縮放比例
    CGFloat scale = pinchGes.scale;
    NSLog(@"scale = %f", scale);
    //縮放圖片
    self.imageView.transform = CGAffineTransformScale(self.imageView.transform, scale, scale);
    //初始化大小
    [pinchGes setScale:1];
}
手勢的混合使用
  • 默認(rèn)情況下只能同時支持一種手勢
  • 若要同時支持多種手勢功咒,可以給要支持的手勢設(shè)置代理,并實(shí)現(xiàn)以下代理方法
// 是否允許同時支持多個手勢
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer  shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
 
    return YES;
}
手勢沖突的解決
  • 單機(jī)和雙擊區(qū)分
[singeTap requireGestureRecognizerToFail:doubleTap];
  • UIPanGestureRecognizer和UITapGestureRecognizer沖突
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
        return NO;
    }
    return YES;
}
  • tableView添加手勢绞蹦,tableView父視圖添加手勢后區(qū)分
#pragma mark tapGestureRecgnizerdelegate 解決手勢沖突
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([touch.view isKindOfClass:[UITableView class]]) {
 return NO;
}
if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) { 
return NO;
}
return YES;
}
  • scrollview和tableview嵌套力奋,區(qū)分滾動代理
#pragma mark - scrollView delegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if ([scrollView isKindOfClass:[UITableView class]]) {
 NSLog(@"UITableView"); 
} else {
 NSLog(@"UIScrollview");
 }
}
  • UIScrollView和子視圖TableView的cell右滑沖突

繼承UIScrollView的子類重寫下面的方法即可

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
 //NSLog(@"手勢觸發(fā)的類=%@",NSStringFromClass([touch.view class]));
// 若為UITableViewCellContentView(即點(diǎn)擊了tableViewCell),則不截獲Touch事件
if ([NSStringFromClass([touch.view class])isEqualToString:@"UITableViewCellContentView"]) { 
return NO;
}return YES;
}
-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
// 若為UITableViewCellContentView(即點(diǎn)擊了tableViewCell)幽七,則不截獲Touch事件
if ([NSStringFromClass([gestureRecognizer.view class])isEqualToString:@"UITableViewCellContentView"]) { 
return NO;
}
return YES;
}

.
iOS 7的手勢滑動返回功能

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末景殷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子澡屡,更是在濱河造成了極大的恐慌滨彻,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挪蹭,死亡現(xiàn)場離奇詭異亭饵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)梁厉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門辜羊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人词顾,你說我怎么就攤上這事八秃。” “怎么了肉盹?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵昔驱,是天一觀的道長。 經(jīng)常有香客問我上忍,道長骤肛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任窍蓝,我火速辦了婚禮腋颠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吓笙。我一直安慰自己淑玫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著絮蒿,像睡著了一般尊搬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上土涝,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天毁嗦,我揣著相機(jī)與錄音,去河邊找鬼回铛。 笑死狗准,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的茵肃。 我是一名探鬼主播腔长,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼验残!你這毒婦竟也來了捞附?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤您没,失蹤者是張志新(化名)和其女友劉穎鸟召,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氨鹏,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡欧募,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了仆抵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跟继。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖镣丑,靈堂內(nèi)的尸體忽然破棺而出舔糖,到底是詐尸還是另有隱情,我是刑警寧澤莺匠,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布金吗,位于F島的核電站,受9級特大地震影響趣竣,放射性物質(zhì)發(fā)生泄漏摇庙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一期贫、第九天 我趴在偏房一處隱蔽的房頂上張望跟匆。 院中可真熱鬧异袄,春花似錦通砍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迹冤。三九已至,卻和暖如春虎忌,著一層夾襖步出監(jiān)牢的瞬間泡徙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工膜蠢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堪藐,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓挑围,卻偏偏與公主長得像礁竞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子杉辙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

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