首先給大家解釋一下為什麼要學習手勢識別?
如果想監聽乙個uiview上面的觸控事件,之前的做法是: 自定義乙個uiview ; 實現uiview的touches方法,在方法裡面實現具體功能
透過touches監聽uiview的觸控事件,有很明顯的幾個缺點:
1.必須要自定義uiview,
2.由於是在view內部的touches方法中監聽觸控事件,因此預設情況下,無法讓其他外界物件監聽uiview的觸控事件
3.不容易區分使用者的具體手勢行為;(touches方法中根據座標變換,判斷x,y值的變化,推出使用者的手勢行為。 這是很麻煩的)
ios3.2之後,蘋果推出了手勢識別功能(gesture recognizer),在觸控事件處理方法,大大簡化了開發者的難度
為了完成手勢識別,必須借助於手勢識別器-uigesturerecognizer
利用uigesturerecognizer,能輕鬆識別使用者在某個view上面的做的一些常見手勢
先介紹一下uigesturerecognizer,它是乙個抽象類,抽象類的意思也就是說uigesturerecognizer是乙個父類(基類),它是沒什麼用的,由它派生出來的子類是我們要具體學習的
下面介紹一下uigesturerecognizer的子類有哪些
1.uitapgesturerecognizer(點按);
2.uipinchgesturerecognizer(捏合,用於縮放)
3.uipangesturerecognizer(拖動)
4.uiswipegesturerecognizer(輕掃)
5.uirotationgesturerecognizer(旋轉)
6.uilongpressgesturerecognizer(長按)
系統給我們提供了6種基本的手勢行為,uigesturerecognizer只是對這6個手勢行為進行乙個統一管理
下面,給大家介紹每個手勢行為的簡單用處,以及注意事項
準備工作:
在viewcontroller中獲取uiimageview屬性
接下來,用uiimageview演示一下6中手勢行為的基本使用
手勢識別的使用步驟:1 建立手勢識別例項(例項化物件,建立手勢) 2.設定手勢識別屬性,例如手指數量,方向等 3.將手勢識別新增到指定的檢視上面(新增手勢)
4 實現手勢觸發監聽方法
第一種:輕點手勢[uitapgesturerecognizer]
注意點1:self.imageview表示我要給imageview檢視新增手勢識別,只有點選imageview才會觸發tap:方法,點出超出imageview的地方,是不會觸發tap:方法的,有的同學寫成self.view是代表給整個大得uiview檢視新增手勢識別,這樣只要點選螢幕就會觸發事件。所以大家一定要注意
注意點2:方法引數的型別要和當前監聽的手勢行為一致,不一致的話會導致手勢行為的屬性沒辦法獲取,不同的手勢行為有不同的屬性;一定要細心
下面我新增手勢識別屬性
第二種:(輕掃手勢)[uiswipegesturerecognizer]
這個時候,只能向右輕掃,才會觸發swip:方法,其餘上下左三個方向都不會觸發,預設是向右觸發方法
如何同時監聽的各種輕掃方向呢?那麼,需要設值手勢行為的direction屬性
看起來沒問題,向左向右都將可以觸發方法,但是請繼續看下面
此時系統已經分不清你到底是向左還是向右輕掃了,只是能監聽到你左右輕掃的手勢行為。無論向左向右,系統都認為你是向左的,這樣我們就無法實現向左向右實現不同的功能了,怎麼解決呢?
解決方法很簡單,就是不同的方向分別建立乙個手勢行為物件,這樣就可以識別輕掃方向,執行對應的**了。很重要,一定要注意
第三種: 長按[uilongpressgesturerecognizer]
手指開始長按一定時間會執行一次方法,鬆開手指的時候又會列印一次方法,這樣肯定不能滿足我們的需求,怎麼解決呢?任何手勢行為都是分階段的。所以根據手勢行為的階段,進行判斷
這是長按手勢比較特殊的地方,一定要注意,長按有乙個手勢屬性
第四種:旋轉 uirotationgesturerecognizer
解釋:sender.rotation屬性是疊加是什麼意思? 當我們手勢旋轉10度的時候,sender.rotation = 10度;如果我們再旋轉10度,此時sender.rotation = 20度;
所以是疊加的,所以要用帶make的cgaffine方法,因為這個方法每次旋轉都是從最初位置開始;
第五種:拖拽 uipangesturerecognizer
第六種:捏合 uipinchgesturerecognizer
經過對六種手勢的簡單實用,需要注意的地方,總結:輕點手勢(tap)可以設定tap.numoftapsrequired屬性,是連續點選幾次會觸發監聽事件
輕掃手勢(swip)需要注意swip手勢需要自己設定輕掃方向,預設是向右的。另外每個方向都要建立乙個手勢,系統監聽方法內部才能判斷是向什麼方向輕掃
長按手勢(longpress) 需要注意長按手勢,當你按住一段時間會觸發一次監聽事件,當你鬆開手指,會再一次觸發監聽事件。所以我們要對手勢的階段進行判斷
旋轉(rotation) 旋轉手勢對應的是獲取旋轉角度屬性sender.rotation 注意是疊加屬性,記得清零
拖拽(pan) 需要注意拖拽手勢對應的是獲取拖拽的點, cgpoint point = [sender translationinview:sender.view];同樣是疊加屬性,記得歸零
捏合(縮放)(pinch) 組要注意縮放手勢獲取的是縮放值,sender.scale ,疊加屬性,記得歸零。但是縮放比例的歸零就是sender.scale = 1.0;
iOS手勢識別初探
uigesturerecognizerstate的定義如下 typedef ns enum nsinteger,uigesturerecognizerstate uigesturerecognizerstatepossible 預設狀態,手勢識別器尚未識別出手勢,但是可能已經在處理觸屏事件了。uig...
iOS各種手勢識別
import viewcontroller.h inte ce viewcontroller property nonatomic,strong uiimageview imageview end implementation viewcontroller synthesize imageview ...
iOS 手勢識別器概述
其相應的方法 initwithtarget action addtarget action removetarget action locationinview locationoftouch inview numberoftouches屬性 requiregesturerecognizertofa...