生活随笔
收集整理的這篇文章主要介紹了
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的代碼如下: 1 ? ? //新建tap手勢 2 ? ? UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)]; 3 ? ? //設置點擊次數和點擊手指數 4 ? ? tapGesture.numberOfTapsRequired = 1; //點擊次數 5 ? ? tapGesture.numberOfTouchesRequired = 1; //點擊手指數 6 ? ? [self.view addGestureRecognizer:tapGesture]; 在回調方法中添加相應的業務邏輯: 1 //輕擊手勢觸發方法 2 -(void)tapGesture:(id)sender 3 { 4 ? ? //輕擊后要做的事情 5 } 2.長按手勢(LongPressGestureRecognizer) 初始化代碼: 1 ? ? //添加長摁手勢 2 ? ? UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressGesture:)]; 3 ? ? //設置長按時間 4 ? ? longPressGesture.minimumPressDuration = 0.5; //(2秒) 5 ? ? [self.view addGestureRecognizer:longPressGesture]; 在對應的回調方法中添加相應的方法(當手勢開始時執行):
| 1 //常摁手勢觸發方法 2 -(void)longPressGesture:(id)sender 3 { 4 ? ? UILongPressGestureRecognizer *longPress = sender; 5 ? ? if (longPress.state == UIGestureRecognizerStateBegan) 6 ? ? { 7 ? ? ? ? UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"提示" message:@"長按觸發" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles: nil]; 8 ? ? ? ? [alter show]; 9 ? ? } 10 } |
代碼說明:手勢的常用狀態如下 開始:UIGestureRecognizerStateBegan 改變:UIGestureRecognizerStateChanged 結束:UIGestureRecognizerStateEnded 取消:UIGestureRecognizerStateCancelled 失敗:UIGestureRecognizerStateFailed 3.輕掃手勢(SwipeGestureRecognizer) 在初始化輕掃手勢的時候得指定輕掃的方向,上下左右。 如果要要添加多個輕掃方向,就得添加多個輕掃手勢,不過回調的是同一個方法。 添加輕掃手勢,一個向左一個向右,代碼如下: 1 ? ? //添加輕掃手勢 2 ? ? UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)]; 3 ? ? //設置輕掃的方向 4 ? ? swipeGesture.direction = UISwipeGestureRecognizerDirectionRight; //默認向右 5 ? ? [self.view addGestureRecognizer:swipeGesture]; 6 7 ? ? //添加輕掃手勢 8 ? ? UISwipeGestureRecognizer *swipeGestureLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)]; 9 ? ? //設置輕掃的方向 10 ? ? swipeGestureLeft.direction = UISwipeGestureRecognizerDirectionLeft; //默認向右 11 ? ? [self.view addGestureRecognizer:swipeGestureLeft]; 回調方法如下:
| 1 //輕掃手勢觸發方法 2 -(void)swipeGesture:(id)sender 3 { 4 ? ? UISwipeGestureRecognizer *swipe = sender; 5 ? ? if (swipe.direction == UISwipeGestureRecognizerDirectionLeft) 6 ? ? { 7 ? ? ? ? //向左輕掃做的事情 8 ? ? } 9 ? ? if (swipe.direction == UISwipeGestureRecognizerDirectionRight) 10 ? ? { 11 ? ? ? ? //向右輕掃做的事情 12 ? ? } 13 } 14 |
4.捏合手勢(PinchGestureRecognizer) 捏合手勢初始化 1 ? ? //添加捏合手勢 2 ? ? UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGesture:)]; 3 ? ? [self.view addGestureRecognizer:pinchGesture]; 捏合手勢要觸發的方法(放大或者縮小圖片):
| 1 捏合手勢觸發方法 2 -(void) pinchGesture:(id)sender 3 { 4 ? ? ?UIPinchGestureRecognizer *gesture = sender; 5 6 ? ? //手勢改變時 7 ? ? if (gesture.state == UIGestureRecognizerStateChanged) 8 ? ? { 9 ? ? ? ? //捏合手勢中scale屬性記錄的縮放比例 10 ? ? ? ? _imageView.transform = CGAffineTransformMakeScale(gesture.scale, gesture.scale); 11 ? ? } 12 13 ? ? //結束后恢復 14 ? ? if(gesture.state==UIGestureRecognizerStateEnded) 15 ? ? { 16 ? ? ? ? [UIView animateWithDuration:0.5 animations:^{ 17 ? ? ? ? ? ? _imageView.transform = CGAffineTransformIdentity;//取消一切形變 18 ? ? ? ? }]; 19 ? ? } 20 } |
5.拖動手勢(PanGestureRecognizer) 拖動手勢的初始化 1 ? ? //添加拖動手勢 2 ? ? UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGesture:)]; 3 ? ? [self.view addGestureRecognizer:panGesture]; 拖動手勢要做的方法(通過translationInView獲取移動的點,和TouchesMoved方法類似) 1 //拖動手勢 2 -(void) panGesture:(id)sender 3 { 4 ? ? UIPanGestureRecognizer *panGesture = sender; 5 6 ? ? CGPoint movePoint = [panGesture translationInView:self.view]; 7 8 ? ? //做你想做的事兒
9 }6.旋轉手勢(RotationGestureRecognizer) 旋轉手勢的初始化 1 ? ? //添加旋轉手勢 2 ? ? UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationGesture:)]; 3 ? ? [self.view addGestureRecognizer:rotationGesture]; 旋轉手勢調用的方法:
| 1 //旋轉手勢 2 -(void)rotationGesture:(id)sender 3 { 4 5 ? ? UIRotationGestureRecognizer *gesture = sender; 6 7 ? ? if (gesture.state==UIGestureRecognizerStateChanged) 8 ? ? { 9 ? ? ? ? _imageView.transform=CGAffineTransformMakeRotation(gesture.rotation); 10 ? ? } 11 12 ? ? if(gesture.state==UIGestureRecognizerStateEnded) 13 ? ? { 14 15 ? ? ? ? [UIView animateWithDuration:1 animations:^{ 16 ? ? ? ? ? ? _imageView.transform=CGAffineTransformIdentity;//取消形變 17 ? ? ? ? }]; 18 ? ? } 19 20 } |
上面的東西沒有多高深的技術,就是對iOS開發中的手勢做了一下小小的總結,溫故一下基礎知識。
最新內容請見作者的GitHub頁:http://qaseven.github.io/
總結
以上是生活随笔為你收集整理的iOS开发之手势识别的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。