手勢事件基礎(chǔ)知識和例子

點擊手勢UITapGestureRecognizer

創(chuàng)建手勢處理器

<pre>
//新建輕拍手勢事件類并添加手勢事件
UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(handleTap:)];
//哪個view需要添加上手勢事件
[self addGestureRecognizer:gesture];
</pre>

一些相關(guān)的屬性(官方解析)

numberOfTapsRequired----設(shè)置該點擊手勢處理器只處理的點擊次數(shù),默認(rèn)為1

numberOfTouchesRequired----默認(rèn)值為1.需要處理的手指數(shù)

UIPinchGestureRecognizer 縮放

<pre>
// 創(chuàng)建UIPinchGestureRecognizer手勢處理器,該手勢處理器激發(fā)scaleImage方法
UIPinchGestureRecognizer* gesture = [[UIPinchGestureRecognizer alloc]
initWithTarget:self action:@selector(scaleImage:)];
// 為imageView添加手勢處理器
[self.imageView addGestureRecognizer:gesture];
</pre>

一些相關(guān)的屬性

scale----相對于屏幕坐標(biāo)中的觸摸點的比例

velocity----縮放速度/秒

例子-通過捏合手勢縮放圖片

<pre>

  • (void) scaleImage:(UIPinchGestureRecognizer*)gesture
    {
    CGFloat scale = gesture.scale;
    // 如果捏合手勢剛剛開始
    if (gesture.state == UIGestureRecognizerStateBegan)
    {
    // 計算當(dāng)前縮放比
    currentScale = self.imageView.image.size.width / srcImage.size.width;
    }
    // 根據(jù)手勢處理的縮放比計算圖片縮放后的目標(biāo)大小
    CGSize targetSize = CGSizeMake(srcImage.size.width * scale * currentScale,
    srcImage.size.height * scale * currentScale);
    // 對圖片進(jìn)行縮放
    self.imageView.image = [srcImage imageByScalingToSize:targetSize];
    }
    </pre>

不多說,直接上Demo例子https://git.oschina.net/qjz.com/pinchImage/tree/master

旋轉(zhuǎn)手勢UIRotationGestureRecognizer

<pre>
//新建旋轉(zhuǎn)手勢事件類并添加手勢事件
UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotatePiece:)];
[self.viewPhoth addGestureRecognizer:rotationGesture];
</pre>

一些相關(guān)的屬性

rotation----旋轉(zhuǎn)的弧度

velocity----縮放速度/秒

旋轉(zhuǎn)圖片的例子

<pre>

  • (void) rotateImage:(UIRotationGestureRecognizer*)gesture
    {
    // 獲取手勢旋轉(zhuǎn)的弧度
    CGFloat rotation = gesture.rotation;
    // 根據(jù)當(dāng)前縮放比計算圖片縮放后的目標(biāo)大小
    CGSize targetSize = CGSizeMake(srcImage.size.width * currentScale,
    srcImage.size.height * currentScale);
    // 對圖片進(jìn)行縮放、旋轉(zhuǎn)
    self.imageView.image = [[srcImage imageByScalingToSize:targetSize]
    imageRotatedByRadians:currentRotation + rotation];
    // 如果旋轉(zhuǎn)手勢結(jié)束
    if(gesture.state == UIGestureRecognizerStateEnded)
    {
    currentRotation = currentRotation + rotation;
    }
    }
    </pre>
    不多說,直接上demo栗子https://git.oschina.net/qjz.com/pinchImage/tree/master

長按手勢UILongPressGestureRecognizer

創(chuàng)建手勢處理器

<pre>
//新建長按手勢事件類并添加手勢事件
UILongPressGestureRecognizer *longGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(viewLongPressGesture:)];
//哪個view需要添加上手勢事件
[self addGestureRecognizer:longGesture];
</pre>

一些相關(guān)的屬性(官方解析)

numberOfTapsRequired----默認(rèn)值為0.在按下手勢識別之前所需的全部點擊數(shù)

numberOfTouchesRequired----默認(rèn)值為1.要識別的手勢必須按住的手指數(shù)

minimumPressDuration----默認(rèn)值為0.5。 以秒為單位的手指必須按住手勢才能識別手勢

allowableMovement----默認(rèn)值為10.手勢失敗前允許的最大移動(以像素為單位)。 一旦識別(在minimumPressDuration之后),對于觸摸跟蹤的剩余部分,手指移動沒有限制

長按手勢中的一些事件

<pre>
typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
UIGestureRecognizerStatePossible, //識別器尚未識別其姿勢,但可以是評估觸摸事件。 這是默認(rèn)狀態(tài)
UIGestureRecognizerStateBegan, // 識別器已經(jīng)接收到被識別為手勢的觸摸。 action方法將在下一個運(yùn)行循環(huán)中調(diào)用
UIGestureRecognizerStateChanged, //識別器已經(jīng)接收到被識別為對手勢的改變的觸摸。 action方法將在下一個運(yùn)行循環(huán)中調(diào)用
UIGestureRecognizerStateEnded, // 識別器已經(jīng)接收到被識別為手勢的結(jié)束的觸摸。 action方法將在下一個運(yùn)行循環(huán)中被調(diào)用,識別器將被重置為UIGestureRecognizerStatePossible
UIGestureRecognizerStateCancelled, // 識別器已經(jīng)接收到導(dǎo)致手勢的取消的觸摸。 action方法將在下一個運(yùn)行循環(huán)中調(diào)用。 識別器將被重置為UIGestureRecognizerStatePossible

UIGestureRecognizerStateFailed,     // 識別器已經(jīng)接收到不能被識別為手勢的觸摸序列。 將不會調(diào)用操作方法,并且識別器將重置為UIGestureRecognizerStatePossible
// 離散手勢 - 識別離散事件但不報告更改的手勢識別器(例如,輕敲)不會通過“開始”和“已更改”狀態(tài)進(jìn)行切換,也不會失敗或被取消
UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // 識別器已經(jīng)接收到被識別為手勢的觸摸。 action方法將在下一個運(yùn)行循環(huán)中被調(diào)用,識別器將被重置為UIGestureRecognizerStatePossible

};
</pre>

移動(輕掃)手勢UISwipeGestureRecognizer

<pre>

for (int i = 0 ; i < 4 ; i++)
{
// 創(chuàng)建手勢處理器,指定使用該控制器的handleSwipe:方法處理輕掃手勢
UISwipeGestureRecognizer* gesture = [[UISwipeGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSwipe:)];
// 設(shè)置該點擊手勢處理器只處理i個手指的輕掃手勢
gesture.numberOfTouchesRequired = 1;
// 指定該手勢處理器只處理1 << i方向的輕掃手勢
gesture.direction = 1 << i;
// 為gv控件添加手勢處理器。
[self.gv addGestureRecognizer:gesture];
}

</pre>

一些相關(guān)的屬性值

numberOfTouchesRequired----默認(rèn)值為1.必須滑動的手指數(shù)

@property(nonatomic) UISwipeGestureRecognizerDirection direction ----默認(rèn)為UISwipeGestureRecognizerDirectionRight。 所需的滑動方向。 可以指定多個方向,如果它們將導(dǎo)致相同的行為(例如,UITableView滑動刪除)

補(bǔ)充UISwipeGestureRecognizerDirection一共四個值,分別是右、左、上、下

typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) {
UISwipeGestureRecognizerDirectionRight = 1 << 0,
UISwipeGestureRecognizerDirectionLeft = 1 << 1,
UISwipeGestureRecognizerDirectionUp = 1 << 2,
UISwipeGestureRecognizerDirectionDown = 1 << 3
};

使用例子:
<pre>
// 實現(xiàn)手勢處理器的方法,該方法應(yīng)該聲明一個形參。
// 當(dāng)該方法被激發(fā)時,手勢處理器會作為參數(shù)傳給該方法的參數(shù)。

  • (void) handleSwipe:(UISwipeGestureRecognizer)gesture
    {
    // 獲取輕掃手勢的方向
    NSUInteger direction = gesture.direction;
    // 根據(jù)手勢方向的值得到方向字符串
    NSString
    dirStr = direction == UISwipeGestureRecognizerDirectionRight
    ? @"向右" : (direction == UISwipeGestureRecognizerDirectionLeft
    ? @"向左" : (direction == UISwipeGestureRecognizerDirectionUp
    ? @"向上" :@"向下"));
    NSUInteger touchNum = gesture.numberOfTouchesRequired;
    self.label.text = [NSString stringWithFormat:
    @"用戶使用%d個手指進(jìn)行輕掃,方向為:%@" , touchNum , dirStr];
    // 指定2秒后清除label的文本
    [self.label performSelector:@selector(setText:)
    withObject:@"" afterDelay:2];
    }
    </pre>

不多說,直接上demo栗子https://git.oschina.net/qjz.com/pinchImage/tree/master

一個仿支付寶“更多”長按移動View,動態(tài)動畫的參考Demo https://github.com/wolfhous/HSUpdateApp

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 手勢識別器是附加到視圖的對象,將低級別事件處理代碼轉(zhuǎn)換為更高級別的操作,它允許視圖以控件執(zhí)行的方式響應(yīng)操作。 手勢...
    坤坤同學(xué)閱讀 4,266評論 0 9
  • -- iOS事件全面解析 概覽 iPhone的成功很大一部分得益于它多點觸摸的強(qiáng)大功能,喬布斯讓人們認(rèn)識到手機(jī)其實...
    翹楚iOS9閱讀 3,223評論 0 13
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,438評論 4 61
  • 高中曾有段時間數(shù)學(xué)課上在數(shù)學(xué)課本寫一些童話故事,現(xiàn)在影響最深的那篇還記得,其實我也不太清楚當(dāng)時為什么寫,只是隱隱有...
    汝墨yan閱讀 382評論 0 1

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