日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IOS 定义手势监听器详解,利用 UIGestureRecognizer 进行捏合、旋转、平移、点击、长按手势事件响应

發布時間:2025/3/12 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IOS 定义手势监听器详解,利用 UIGestureRecognizer 进行捏合、旋转、平移、点击、长按手势事件响应 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

IOS中我們可以通過UITouch進行觸摸事件監聽,但是UITouch實現捏合、旋轉、長按等手勢事件監聽非常麻煩。IOS中提供 UIGestureRecognizer 的子類幫我們簡潔等實現捏合、旋轉等特殊手勢監聽。并且一個視圖可添加多個不同等手勢監聽器。

開啟userInteractionEnabled

IOS 中UIView 默認是不可響應事件的,我們需要開啟 userInteractionEnabled 方可進行事件響應。下面代碼中我們創建了一個圖片視圖,并且開始事件響應。UIView 通過 addGestureRecognizer 進行添加手勢監聽器和 removeGestureRecognizer刪除手勢監聽器

// 創建圖片視圖 - (void) creareImg {UIImage* image = [UIImage imageNamed:@"zz.jpeg"];_imageView = [[UIImageView alloc] initWithImage:image];UIScreen* screen = [UIScreen mainScreen];const int width = 200;const int height = 100;const float x = screen.bounds.size.width / 2 - width / 2;const float y = screen.bounds.size.height / 2 - height;_imageView.frame = CGRectMake(x, y, width, height);_imageView.userInteractionEnabled = YES;[self.view addSubview:_imageView]; }

了解UIGestrueRecognizer

在開始使用自定義手勢之前我們先了解一下 UIGestrueRecognizer 的,因為自定義都是基于 UIGestrueRecognizer 繼承實現的。 UIGestrueRecognizer 是一個手勢監聽器,它可以設置多個手指同時觸發觸發事件等行為。它具有代理協議 UIGestureRecognizerDelegate 下面我來看一下它主要的屬性和API、代理方法。

屬性
名稱類型說明默認值
stateUIGestureRecognizerState當前手勢狀態,可分為手勢開始,手勢改變,手勢結束等等
enabledBOOL是否啟用YES
viewUIView手勢監聽的視圖
requiresExclusiveTouchTypeBOOL是否忽略其他手勢類型,設置為YES將只響應一種手勢類型NO
numberOfTouchesNSUInteger多少根手指觸發手勢1
API
  • - (instancetype)initWithTarget:(nullable id)target action:(nullable SEL)action 初始化并添加事件監聽函數
  • - (void)addTarget:(id)target action:(SEL)action 添加事件監聽函數
  • - (void)removeTarget:(nullable id)target action:(nullable SEL)action 刪除事件監聽函數
  • - (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer 添加其他手勢沖突失效器,當觸發當前手勢時,指定的手勢將失效。
  • - (CGPoint)locationInView:(nullable UIView*)view 獲取相對于指定視圖的坐標位置
  • - (CGPoint)locationOfTouch:(NSUInteger)touchIndex inView:(nullable UIView*)view 獲取指定手指相對指定視圖的坐標位置
代理協議
  • - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 手勢準備開啟時候觸發,返回NO則取消手勢。

  • - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 當手勢與其他手勢同時發生識別時候觸發,返回YES運行兩個手勢同時進行,返回NO則阻止同時識別。

  • - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 是否給事件接收手指。在手勢開始觸發事件觸發前觸發,返回NO可以阻止事件獲取觸摸的手指。

  • - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceivePress:(UIPress *)press 是否給按下事件接收手指,在按下手勢事件觸發前觸發。返回NO可阻止事件獲取觸摸的手指。

我們了解清除GestureRecognizer 類,下面我們來了解其子類手勢的使用。

UITapGestureRecognizer 點擊手勢

點擊手勢,可設置手指數量、點擊次數觸發的手勢

// 創建點擊手勢 - (void) createTapGes {_imageView.userInteractionEnabled = YES; // 開啟響應事件屬性UITapGestureRecognizer* tapOneGes = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(big)]; // 創建手勢tapOneGes.numberOfTapsRequired = 1; // 觸發事件的點擊次數tapOneGes.numberOfTouchesRequired = 1; // 觸發事件的手指數量[_imageView addGestureRecognizer:tapOneGes]; // 添加手勢監聽器 } // 點擊觸發事件 - (void) big {UIScreen* screen = [UIScreen mainScreen];[UIView beginAnimations:nil context:nil]; // 開始布局動畫_imageView.frame = CGRectMake(0, 0, screen.bounds.size.width, screen.bounds.size.height);[UIView commitAnimations]; // 結束布局動畫 }

UIPinchGestureRecognizer 捏合手勢

捏合手勢,表示雙指捏合縮放的手勢觸發。常用于對圖片查看縮放事件監聽

// 捏合手勢 - (void) createPinchGes {UIPinchGestureRecognizer* pinch = [[UIPinchGestureRecognizer alloc] init]; // 創建手勢[pinch addTarget:self action:@selector(scale:)]; // 添加事件函數pinch.delegate = self; // 設置代理[_imageView addGestureRecognizer:pinch]; // 視圖添加手勢監聽器 }- (void) scale: (UIPinchGestureRecognizer*) pinch {UIView* IView = pinch.view; // 獲取監聽的視圖CGAffineTransform transiform = CGAffineTransformScale(IView.transform, pinch.scale, pinch.scale); // 計算縮放后的矩陣if (transiform.a < 0.4) { // 縮放小于0.4阻止transiform.a = 0.4;transiform.d = 0.4;}IView.transform = transiform; // 重新設置矩陣pinch.scale = 1; // 重置縮放矩陣,否則手勢會一直累加 }// 添加允許多個手勢觸發代理函數 - (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {return YES; }

上面代碼中我們通過獲取捏合手勢的scale 屬性獲取用戶捏合縮放的大小。并且使用內置api CGAffineTransformScale 重新計算了視圖的2D矩陣(矩陣表示圖像變形,可以了解一下圖形學),注意!最后一步中必須重置手勢的scale 否則會一直累加導致計算矩陣錯誤,如果不想重置的話那就需要修改 CGAffineTransformScale的第一個參數為基礎矩陣參數。

UIRotationGestureRecognizer 旋轉手勢

旋轉手勢,可獲取用戶手指旋轉的角度。

// 旋轉手勢 - (void) createRotateGes {UIRotationGestureRecognizer* rotate = [[UIRotationGestureRecognizer alloc] init];[rotate addTarget:self action:@selector(rotate:)];rotate.delegate = self;[_imageView addGestureRecognizer:rotate]; } // 旋轉觸發事件 - (void) rotate: (UIRotationGestureRecognizer*) rotate {UIView* IView = rotate.view;IView.transform = CGAffineTransformRotate(IView.transform, rotate.rotation); // 重新計算視圖矩陣rotate.rotation = 0; }

UIPanGestureRecognizer 平移手勢

平移動手勢,比較簡單就是手指移動時候觸發,但是提供平移的位置和平移的速度

// 平移手勢 - (void) createPanGes {UIPanGestureRecognizer* pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];pan.delegate = self;[_imageView addGestureRecognizer:pan]; } - (void) pan: (UIPanGestureRecognizer*)pan {CGPoint speed = [pan velocityInView:_imageView]; // 獲取移動速度NSLog(@"x速度= %f, y速度= %f", speed.x, speed.y);CGPoint translation = [pan translationInView:_imageView]; // 獲取移動矩陣CGAffineTransform transform = CGAffineTransformTranslate(_imageView.transform, translation.x, translation.y);_imageView.transform = transform; }

UILongPressGestureRecognizer 長按手勢

長按對應視圖觸發手勢,可設置手指數量和手指長按時間

// 長按手勢 - (void) createLongPassGes {UILongPressGestureRecognizer* longPass = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(pass:)];longPass.minimumPressDuration = 1; // 設置長按觸發時間,默認0.5[_imageView addGestureRecognizer: longPass]; }- (void)pass: (UILongPressGestureRecognizer*) longPass {if (longPass.state == UIGestureRecognizerStateBegan) {NSLog(@"開始長按");} else if (longPass.state == UIGestureRecognizerStateEnded) {NSLog(@"結束長按");} else if (longPass.state == UIGestureRecognizerStateChanged) {NSLog(@"長按發生改變");} }

UISwipeGestureRecognizer 輕滑手勢

輕滑手勢,類似我們的平移手勢。但是輕滑不同的是在用戶快速滑動時候速度,并且只提供滑動方向。

// 創建輕滑手勢 - (void) createSwipe {UISwipeGestureRecognizer* swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swiper:)];swipe.direction = UISwipeGestureRecognizerDirectionDown;[_imageView addGestureRecognizer: swipe];swipe.delegate = self; }- (void) swiper: (UISwipeGestureRecognizer*)swiper {NSLog(@"發生向下滑動"); }

總結

以上是生活随笔為你收集整理的IOS 定义手势监听器详解,利用 UIGestureRecognizer 进行捏合、旋转、平移、点击、长按手势事件响应的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。