iOS開發教程之手勢識別方法
感覺有必要把iOS開發中的手勢識別做一個小小的總結。在上一篇iOS開發之自定義表情鍵盤(元件封裝與自動佈局)部落格中用到了一個輕擊手勢,就是在輕擊TextView時從表情鍵盤迴到系統鍵盤,在TextView中的手是用storyboard新增的。下面會先給出如何用storyboard給相應的控制元件新增手勢,然後在用純程式碼的方式給我們的控制元件新增手勢,手勢的用法比較簡單。和button的用法類似,也是目標動作回撥,話不多說,切入今天的正題。總共有六種手勢識別:輕擊手勢(TapGestureRecognizer),輕掃手勢(SwipeGestureRecognizer), 長按手勢(LongPressGestureRecognizer), 拖動手勢(PanGestureRecognizer), 捏合手勢(PinchGestureRecognizer),旋轉手勢(RotationGestureRecognizer);
其實這些手勢用touche事件完全可以實現,蘋果就是把常用的觸控事件封裝成手勢,來提供給使用者。讀者完全可以用TouchesMoved來寫拖動手勢等
一,用storyboard給控制元件新增手勢識別,當然啦用storyboard得截張圖啦
1.用storyboard新增手勢識別,和新增一個Button的步驟一樣,首先我們得找到相應的手勢,把手勢識別的控制元件拖到我們要新增手勢的控制元件中,截圖如下
2.給我們拖出的手勢新增回撥事件,和給Button回撥事件沒啥區別的,在回撥方法中新增要實現的業務邏輯即可,截圖如下:
二,純程式碼新增手勢識別
用storyboard可以大大簡化我們的操作,不過純程式碼的方式還是要會的,就像 要Dreamwear編輯網頁一樣(當然啦,storyboard的拖拽功能要比Dreamwear的拖拽強大的多),用純程式碼敲出來的更為靈活,更加便 於維護。不過用storyboard可以減少我們的工作量,這兩個要配合著使用才能大大的提高我們的開發效率。個人感覺用storyboard把框架搭起 來(Controller間的關係),一下小的東西還是用純程式碼敲出來更好一些。下面就給出如何給我們的控制元件用純程式碼的方式來新增手勢識別。
1.輕擊手勢(TapGestureRecognizer)的新增
初始化程式碼TapGestureRecongnizer的程式碼如下:
//新建tap手勢 UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)]; //設定點選次數和點選手指數 tapGesture.numberOfTapsRequired = 1; //點選次數 tapGesture.numberOfTouchesRequired = 1; //點選手指數 [self.view addGestureRecognizer:tapGesture];
在回撥方法中新增相應的業務邏輯:
//輕擊手勢觸發方法 -(void)tapGesture:(id)sender { //輕擊後要做的事情 }
2.長按手勢(LongPressGestureRecognizer)
初始化程式碼:
//新增長摁手勢 UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressGesture:)]; //設定長按時間 longPressGesture.minimumPressDuration = 0.5; //(2秒) [self.view addGestureRecognizer:longPressGesture];
在對應的回撥方法中新增相應的方法(當手勢開始時執行):
//常摁手勢觸發方法 -(void)longPressGesture:(id)sender { UILongPressGestureRecognizer *longPress = sender; if (longPress.state == UIGestureRecognizerStateBegan) { UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"提示" message:@"長按觸發" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles: nil]; [alter show]; } }
程式碼說明:手勢的常用狀態如下
開始:UIGestureRecognizerStateBegan
改變:UIGestureRecognizerStateChanged
結束:UIGestureRecognizerStateEnded
取消:UIGestureRecognizerStateCancelled
失敗:UIGestureRecognizerStateFailed
3.輕掃手勢(SwipeGestureRecognizer)
在初始化輕掃手勢的時候得指定輕掃的方向,上下左右。 如果要要新增多個輕掃方向,就得新增多個輕掃手勢,不過回撥的是同一個方法。
新增輕掃手勢,一個向左一個向右,程式碼如下:
//新增輕掃手勢 UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)]; //設定輕掃的方向 swipeGesture.direction = UISwipeGestureRecognizerDirectionRight; //預設向右 [self.view addGestureRecognizer:swipeGesture]; //新增輕掃手勢 UISwipeGestureRecognizer *swipeGestureLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)]; //設定輕掃的方向 swipeGestureLeft.direction = UISwipeGestureRecognizerDirectionLeft; //預設向右 [self.view addGestureRecognizer:swipeGestureLeft];
回撥方法如下:
//輕掃手勢觸發方法 -(void)swipeGesture:(id)sender { UISwipeGestureRecognizer *swipe = sender; if (swipe.direction == UISwipeGestureRecognizerDirectionLeft) { //向左輕掃做的事情 } if (swipe.direction == UISwipeGestureRecognizerDirectionRight) { //向右輕掃做的事情 } }
4.捏合手勢(PinchGestureRecognizer)
捏合手勢初始化
//新增捏合手勢 UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGesture:)]; [self.view addGestureRecognizer:pinchGesture];
捏合手勢要觸發的方法(放大或者縮小圖片):
////捏合手勢觸發方法 -(void) pinchGesture:(id)sender { UIPinchGestureRecognizer *gesture = sender; //手勢改變時 if (gesture.state == UIGestureRecognizerStateChanged) { //捏合手勢中scale屬性記錄的縮放比例 _imageView.transform = CGAffineTransformMakeScale(gesture.scale, gesture.scale); } //結束後恢復 if(gesture.state==UIGestureRecognizerStateEnded) { [UIView animateWithDuration:0.5 animations:^{ _imageView.transform = CGAffineTransformIdentity;//取消一切形變 }]; } }
5.拖動手勢(PanGestureRecognizer)
拖動手勢的初始化
//新增拖動手勢 UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGesture:)]; [self.view addGestureRecognizer:panGesture];
拖動手勢要做的方法(通過translationInView獲取移動的點,和TouchesMoved方法類似)
//拖動手勢 -(void) panGesture:(id)sender { UIPanGestureRecognizer *panGesture = sender; CGPoint movePoint = [panGesture translationInView:self.view]; //做你想做的事兒 }
6.旋轉手勢(RotationGestureRecognizer)
旋轉手勢的初始化
//新增旋轉手勢 UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationGesture:)]; [self.view addGestureRecognizer:rotationGesture];
旋轉手勢呼叫的方法:
//旋轉手勢 -(void)rotationGesture:(id)sender { UIRotationGestureRecognizer *gesture = sender; if (gesture.state==UIGestureRecognizerStateChanged) { _imageView.transform=CGAffineTransformMakeRotation(gesture.rotation); } if(gesture.state==UIGestureRecognizerStateEnded) { [UIView animateWithDuration:1 animations:^{ _imageView.transform=CGAffineTransformIdentity;//取消形變 }]; } }
相關文章
- ReactNative之手勢識別React
- iOS開發學習之觸控事件和手勢識別iOS事件
- IOS人臉識別開發入門教程--人臉檢測篇iOS
- iOS開發系列--觸控事件、手勢識別、搖晃事件、耳機線控iOS事件
- 人臉識別和手勢識別應用(face++)開發
- [IOS開發教程] NSfileManager的使用方法iOS
- iOS開發-手勢iOS
- Swift之手勢操作Swift
- iOS專案開發實戰——使用手勢識別判斷使用者操作iOS
- iOS學習筆記06 手勢識別iOS筆記
- [譯] 深入 Flutter 之手勢Flutter
- 開源姿勢識別軟體
- iOS開發中識別圖中的二維碼iOS
- iOS 11開發教程(一)iOS
- iOS開發-類別&延展iOS
- 整理:iOS開發知識點iOS
- iOS 開發知識小集(1)iOS
- iOS與Flutter混合開發的姿勢iOSFlutter
- 軟體測試教程之手機軟體測試方法
- Flutter實戰之手勢基礎篇Flutter
- Flutter外掛iOS端開發教程FlutteriOS
- iOS Touch ID 簡易開發教程iOS
- 別隻盯著谷歌亞馬遜,美國國安局才是聲紋識別的「無形之手」谷歌亞馬遜
- Bios開啟CSM識別M.2固態硬碟方法 M.2固態硬碟無法識別?iOS硬碟
- iOS 開發中遇到的手勢衝突iOS
- 手勢識別中一些錯誤解決方法
- iOS開發之OCR光學識別儲蓄卡以及信用卡iOS
- [iOS開發]Carthage安裝和使用教程iOS
- iOS藍芽4.0開發基礎教程iOS藍芽
- 人臉識別智慧考勤系統開發_人臉識別考勤管理系統開發
- 破解教程之手脫UPX的DLL
- [譯] 用於 iOS 的 ML Kit 教程:識別影像中的文字iOS
- 提高iOS App開發效率的方法iOSAPP
- iOS開發- reloadData方法介紹iOS
- 行駛證駕照識別開發
- android 多手勢識別Android
- iOS身份證號識別iOS
- 智慧人臉識別門禁系統開發,人臉識別開鎖流程