iOS 開發(fā)中的常用手勢(shì)事件簡(jiǎn)述

在開發(fā)過程中,我們?yōu)榱颂岣哂脩趔w驗(yàn)和App的交互友好性,我們通常會(huì)在App中添加一些手勢(shì),來輔助用戶操作.那么這篇文章將簡(jiǎn)述一下在開發(fā)過程中我們經(jīng)常用到的手勢(shì)事件.

管理手勢(shì)事件的類是UIGestureRecognizer,這是一個(gè)手勢(shì)識(shí)別器.而手勢(shì)識(shí)別器則是一個(gè)特殊的觸摸事件.手勢(shì)事件是使用了target-action模式(目標(biāo)-動(dòng)作模式)設(shè)計(jì)的,所以我們?cè)谑褂玫臅r(shí)候指定目標(biāo)跟動(dòng)作就好了.

UIGestureRecognizer

UIGestureRecognizer是一個(gè)抽象的父類,在開發(fā)過程中我們一般不使用這個(gè)類,而是使用其子類.

UIGestureRecognizer的子類

上圖展示了UIGestureRecognizer的子類.下面我們就來介紹其中常用的集中手勢(shì)事件.

First

我們進(jìn)行描述之前先假定一個(gè)場(chǎng)景,在UIViewController上有一個(gè)UIView,設(shè)置顏色為紅色,我們?nèi)∶麨閞edView.現(xiàn)在我們對(duì)其進(jìn)行手勢(shì)添加.

場(chǎng)景

UIPanGestureRecognizer平移手勢(shì)

現(xiàn)在UIView上面是沒有任何可以被觸發(fā)的事件的,現(xiàn)在我們添加一個(gè)平移手勢(shì),讓這張圖片可以在屏幕上任意平移.
此時(shí)我們會(huì)用到UIGestureRecognizer的子類UIPanGestureRecognizer,在API中有兩個(gè)屬性三個(gè)方法.其中屬性使用來控制觸摸到UIView 的觸點(diǎn)個(gè)數(shù).方法我們通過代碼演示.
代碼如下:

// 我們初始化這個(gè)手勢(shì)事件,并為它制定一個(gè)觸發(fā)方法,就是讓他平移
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panView:)];
//我們將手勢(shì)事件添加到view上
[_redView addGestureRecognizer:pan];

平移手勢(shì)觸發(fā)的方法為:

- (void)panView:(UIPanGestureRecognizer *)sender{
    CGPoint point = [sender translationInView:_redView];    
    // 以上次位置為標(biāo)準(zhǔn)
    sender.view.transform = CGAffineTransformTranslate(sender.view.transform, point.x, point.y);
    // 增量值為零
    [sender setTranslation:CGPointZero inView:sender.view];
}

我們?yōu)榱四茏屵@個(gè)View自由平移,我們?cè)O(shè)置為每次移動(dòng)是以上一次的位置為標(biāo)準(zhǔn),并且其增量值為零.

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

UIScreenEdgePanGestureRecognizer是UIPanGestureRecognizer的子類,比父類多了一個(gè)屬性

UIScreenEdgePanGestureRecognizer

同樣是上面的場(chǎng)景,如果我們?cè)趘iew上添加屏幕邊緣手勢(shì),但是首先聲明一下,由于是屏幕邊緣移動(dòng),我們知道,屏幕四個(gè)邊緣,上,左,下,右.所以我們?cè)谔砑邮謩?shì)的時(shí)候必須先設(shè)置UIScreenEdgePanGestureRecognizer的edges這個(gè)屬性.在這里我設(shè)置為滑動(dòng)右側(cè)邊緣,視圖移動(dòng).

edges這個(gè)屬性

它是一個(gè)枚舉變量,枚舉元素表示出發(fā)這個(gè)事件需要的手勢(shì)位置.

    UIScreenEdgePanGestureRecognizer *screenEdgePan = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(screenEdgePanView:)];
    // 屬性設(shè)置(設(shè)置邊界)
    // 注意,使用屏幕邊緣平移,需要注意兩點(diǎn)
    // 1.視圖的位置
    // 2.設(shè)置edges屬性
    screenEdgePan.edges = UIRectEdgeRight;
    [_redView addGestureRecognizer:screenEdgePan];

我們同樣為它添加移動(dòng)事件.

- (void)screenEdgePanView:(UIScreenEdgePanGestureRecognizer *)sender{
    // 計(jì)算偏移量
    CGPoint point = [sender translationInView:_redView];
    // 進(jìn)行平移
    sender.view.transform = CGAffineTransformMakeTranslation(point.x, point.y);   
}

UITapGestureRecognizer輕拍事件

輕拍事件有兩個(gè)屬性,分別是設(shè)置輕拍時(shí)手指的個(gè)數(shù)和輕拍的次數(shù).

UITapGestureRecognizer

我們依然使用上面的場(chǎng)景,為了演示效果,我們?cè)O(shè)置輕拍手指為兩個(gè),輕拍次數(shù)為兩次.觸發(fā)的事件是隨機(jī)變換顏色.

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapView:)];
    // 設(shè)置屬性
    // 輕拍次數(shù)
    tap.numberOfTapsRequired = 2;
    // 手指?jìng)€(gè)數(shù)
    tap.numberOfTouchesRequired = 2; 
    // 添加到視圖上
    [_redView addGestureRecognizer:tap];

觸發(fā)的事件為:

- (void)tapView:(UITapGestureRecognizer *)sender{   
    _redView.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:0.9];
}

UISwipeGestureRecognizer輕掃手勢(shì)

輕掃手勢(shì)有兩個(gè)屬性:
第一個(gè)是設(shè)置輕掃手指的個(gè)數(shù),默認(rèn)是一個(gè).而第二個(gè)則是設(shè)置輕掃的方向.我們?cè)趘iew上面添加手勢(shì),手勢(shì)觸發(fā)的事件依然是讓view的顏色隨機(jī)改變.

    UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeView:)];
    swipe.numberOfTouchesRequired = 1;
    // 設(shè)置輕掃方向
//    swipe.direction = UISwipeGestureRecognizerDirectionUp;
    swipe.direction = UISwipeGestureRecognizerDirectionDown;
//    swipe.direction = UISwipeGestureRecognizerDirectionLeft;
//    swipe.direction = UISwipeGestureRecognizerDirectionRight;
    [_redView addGestureRecognizer:swipe];

觸發(fā)的事件為:

- (void)swipeView:(UISwipeGestureRecognizer *)sender{
    _redView.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:0.9]; 
}

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

對(duì)于長(zhǎng)按手勢(shì)我們?cè)O(shè)置的場(chǎng)景依然跟上面一樣.

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

在上面的代碼中,我們通過長(zhǎng)按手勢(shì)的minimumPressDuration屬性來設(shè)置最小長(zhǎng)按時(shí)間,也就是設(shè)置了事件longPressView:被觸發(fā)所需要長(zhǎng)按的最小時(shí)間.

對(duì)于長(zhǎng)按手勢(shì),我們?cè)O(shè)置的事件依舊是隨機(jī)改變顏色

- (void)longPressView:(UILongPressGestureRecognizer *)sender{
    // 判斷手勢(shì)狀態(tài)
    if (sender.state == UIGestureRecognizerStateEnded) {
         NSLog(@"長(zhǎng)按狀態(tài)!");
        _redView.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:0.9];
    } 
}

在上面的代碼中我們通過state來判斷手勢(shì)的狀態(tài),這個(gè)屬性是其父類的屬性,這個(gè)屬性中包含了手勢(shì)事件從開始到結(jié)束的整個(gè)狀態(tài).讀者可以自行參考蘋果官方API,在此就不贅述.以上就是長(zhǎng)按手勢(shì).

UIPinchGestureRecognizer捏合手勢(shì)

我們都知道當(dāng)我們查看相冊(cè)中照片的時(shí)候,我們會(huì)通過手指的捏合或擴(kuò)展來進(jìn)行照片的縮小或放大.我們利用上面的場(chǎng)景對(duì),view進(jìn)行添加捏合手勢(shì)實(shí)現(xiàn)類似的功能.

在此,我們可以按住鍵盤的Alt鍵加上鼠標(biāo)來實(shí)現(xiàn)這個(gè)場(chǎng)景的模擬.

UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchView:)];
    
// 添加手勢(shì)
[_redView addGestureRecognizer:pinch];

相信通過上面的手勢(shì),我們?cè)谶@個(gè)地方已經(jīng)不需要描述事件的觸發(fā)了

- (void)pinchView:(UIPinchGestureRecognizer *)sender{
    // 以上一次的為標(biāo)準(zhǔn)
    sender.view.transform = CGAffineTransformScale(sender.view.transform, sender.scale, sender.scale);
    // 重新設(shè)置縮放比例(1是正??s放, <1 是縮小, >1是放大 )
    sender.scale = 1;    
}

在這里我們使用了仿射變換來控制view放大縮小的比例.

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

如同上面一樣我們使用同樣的方法來創(chuàng)建手勢(shì),并添加到視圖上.

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

我們依舊使用2D仿射變換來實(shí)現(xiàn)View的旋轉(zhuǎn)

- (void)rotationView:(UIRotationGestureRecognizer *)sender{
    
    // 兩個(gè)參數(shù),以上一次的位置為標(biāo)準(zhǔn)
    sender.view.transform = CGAffineTransformRotate(sender.view.transform, sender.rotation);
    // 清除增量
    sender.rotation = 0.0;
   
}

其他

在UIView中有一個(gè)gestureRecognizers屬性,它表征了View上面的手勢(shì)類型,我們可以通過這個(gè)屬性來遍歷查看View上面添加的手勢(shì).

for (UIGestureRecognizer *ges in _redView.gestureRecognizers) {
        NSLog(@"%@",ges);
    }

總結(jié)

以上我們介紹了幾種簡(jiǎn)單的手勢(shì).在開發(fā)過程中,我們可以通過添加手勢(shì)來提高用戶體驗(yàn),增加App對(duì)用戶的友好性.相信通過上面的幾種手勢(shì),我們隊(duì)iOS開發(fā)中的手勢(shì)也有了大致的了解,如果您在閱讀過程中發(fā)現(xiàn)疑問或者疏漏,歡迎留言探討或更正,我將不勝感激.

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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