天天看點

iOS學習,手勢識别,storyboard簡化版

寫在前面

剛開始學習iOS開發,在此過程中學習到很多知識點,寫這些的目的,首先是為了給像我一樣的小白提供一些參考資料,其次是對自己所學知識的一個總結與記錄。

廢話不多說,下面開始。

閑來無事,在storyboard中看到幾個沒用過的控件,這幾個控件都是一類,看名字應該都是手勢。 storyboard給我的感覺就是簡化代碼,既然在storyboard中有了gesture的控件,那麼做一些手勢識别的事情是不是更簡單呢?還是先查了資料,發現有個外國大神已經介紹很清晰了,同時還有中文版的,在此,對這些翻譯組的同學表示感謝。給一個傳送門: 原文:http://www.raywenderlich.com/6567/uigesturerecognizer-tutorial-in-ios-5-pinches-pans-and-more 中文:http://blog.csdn.net/toss156/article/details/7354240

PS:就因為帶了個圖,一直顯示文章是:待稽核。這打擊我後續更新的積極性啊。算了,其他方法都類似,大家command點選進去也能一探究竟,我就暫時不更新了。等有時間,把後面一次整理還,一次釋出一下。

都介紹這麼清晰了,我為啥還寫呢(不是刷資料啊)? 因為我覺得其中有些步驟還可以簡化,為啥大神沒提,沒深究,可能當時的版本原因。在storyboard中,最喜歡幹的事情就是托線,我就将gesture的托線進行到底,因為剛看了第一個手勢識别--拖動,我就先寫這個,後續還有更新。 我覺得控制gesture和控制button等控件一樣,可以簡化為三部: 1,托一個控件到viewController 2,連線到.h或者.m(匿名) 3,實作托線時的方法(如果是action)

準備工作

不用導入架構、庫。至少在我這裡,不導入也能實作基本功能。

正式開始

Pan Gesture Recognizer---拖動

1.建立一個工程。進入storyboard,給預設的viewController中托如一個imageView,然後從外面導入一個照片,在imageView的image屬性中設定導入的照片。這步簡單,不多解釋。 2.找到Pan Gesture Recognizer

iOS學習,手勢識别,storyboard簡化版

把這個控件拖到imageView上。這時候,你會發現左側Document Outline中,viewController下多了一個gesture。 3.把編輯視圖選為 show Assistant Editor ,就是視圖選擇那三個按鈕的中間那個,點了後能左右對稱打開兩個editor。左邊為storyboard,右邊為viewController的.h 或者 .m。 之後像平時托線一樣,把document Outline中的gesture那個圖示托線到.h或者.m上,跟平時一樣了,可以選outlet或者action,測試下,選action,輸入名字,id type用gesture的,之後在.m中實作方法。 4.我的測試方法跟上面參考文中的方法一樣,就是拖動那個image,直接看原文代碼也可以,不過我還是提供了我的代碼。

- (IBAction)changePosition:(UIPanGestureRecognizer *)sender {
	CGPoint changedPosition = [sender translationInView:self.view];
	sender.view.center = CGPointMake(sender.view.center.x + changedPosition.x, sender.view.center.y + changedPosition.y);
	[sender setTranslation:CGPointMake(0, 0) inView:self.view];
}
           

UIPanGestureRecognizer類有一個translationInView:方法,傳回一個CGPoint,這個點就是使用者托東西結束時候的變化的位置,就是位置改變量,裡面的x,y就是對應的位置改變的坐标分量。 傳入的參數,就是在那個view範圍執行Pan,拖動,為了坐标的擷取。 sender.view.center,感覺UIPanGestureRecognizer像一個容器,裡面就是持有此gestrue的view,代碼中就是那個imageView,然後對imageView的center進行修改達到圖形移動的目的。 最後要對translation置零,不然每次擷取的位移改變都是矢量遞增的。比如原來位置是(10,10),移動到(10,50)---向右移動40,translation是(0,40),如果不清零,當再次移動到(10,60)--向右移動10,按我們的邏輯,這時再調用此回調方法,translation應該是(0,10),但是如果我們不清零,translation會是(0,60),随意第二次你滑動的距離比第一次的距離短,但是圖檔向右移動更多。

5.在storyboard中選中imageView,選擇允許與使用者互動:User interaction enabled。相信很多人都用過,我就不截圖了。 點選運作,試試吧。 --------------------------------------------------------------------------------------------------------------

Pinch Gesture Recognizer---兩指頭捏合

如果上面的方法你完全掌握了,這不用看你也會用。在上面基礎上: 1.storyboard中,托一個Pinch Gesture Recognizer還是到那個imageView上,左側document outline又多了一個gesture,是pinch的,然後打開雙列editor 2.托線這個pinch到.h或者.m,選action,起名字,type用gesture的 3.實作方法,這個是兩指頭捏合

同理,我還是提供了下我的代碼,和大神的一樣,友善大家加深印象(其實是我懶)

- (IBAction)changeScale:(UIPinchGestureRecognizer *)sender {
	sender.view.transform = CGAffineTransformScale(sender.view.transform, sender.scale, sender.scale);
	sender.scale = 1;
}
           

這比上面那個還簡單,因為蘋果直接封裝了形變控制,就是那個transform,是以代碼簡單,兩行。 PinchGestureRecognizer類裡有scale,(因為Pinch是倆指頭縮放,縮放肯定會有縮放的程度,就用scale來代表)直接指派到CGAffineTransformScale方法中。 如果沒記錯(如果錯了,歡迎大家指正)第一個參數是原transform,第二個參數是x放大,第三個參數是y放大。 同PanGestureRecognizer,這個scale用完也要進行修改,不然它就把上一次的scale儲存到transform中,下次你調用時候,第一個參數輸入transform,裡面的scale就是上次的scale,會造成你控件成倍放大。

繼續閱讀