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、代理方法。
屬性
| state | UIGestureRecognizerState | 當前手勢狀態,可分為手勢開始,手勢改變,手勢結束等等 | |
| enabled | BOOL | 是否啟用 | YES |
| view | UIView | 手勢監聽的視圖 | |
| requiresExclusiveTouchType | BOOL | 是否忽略其他手勢類型,設置為YES將只響應一種手勢類型 | NO |
| numberOfTouches | NSUInteger | 多少根手指觸發手勢 | 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 进行捏合、旋转、平移、点击、长按手势事件响应的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小程序消息服务器webapi,小程序订阅
- 下一篇: c语言输入一个数求因数,【代码】求一个数