UIGestureRecognizer手勢
一:手勢衍生類
在iPhone或iPad的開發(fā)中检柬,除了用touchesBegan / touchesMoved / touchesEnded這組方法來控制使用者的手指觸控外蔼紧,也可以用UIGestureRecognizer的衍生類別來進行判斷。用UIGestureRecognizer的好處在于有現(xiàn)成的手勢,開發(fā)者不用自己計算手指移動軌跡。UIGestureRecognizer的衍生類別有以下幾種:
UITapGestureRecognizer點一下
UIPinchGestureRecognizer二指往內(nèi)或往外撥動
UIRotationGestureRecognizer旋轉(zhuǎn)
UISwipeGestureRecognizer滑動,快速移動
UIPanGestureRecognizer拖移岩榆,慢速移動
UILongPressGestureRecognizer長按
這些手勢別在使用上也很簡單,只要在使用前定義并添加到對應(yīng)的視圖上即可。
二:手勢的使用
首先要開啟用戶交互屬性(只有此屬性設(shè)為YES 添加的手勢才會生效)
_imageView.userInteractionEnabled = YES;
然后給imageView添加點擊手勢
//UIGestureRecognizer 是所有手勢的基類(父類)
//點擊手勢
//target- action 叫 目標(biāo)-動作機制朗恳,(得益于oc的動態(tài)運行時機制湿颅,可以讓任意target對象载绿,執(zhí)行任何aciton方法)
//將點擊手勢粥诫,添加到imageView上(默認(rèn)為單擊)
//設(shè)置點擊次數(shù) 默認(rèn)為2的時候為雙擊觸發(fā)
tap.numberOfTapsRequired =1;
//需要多少個手指同時點擊觸發(fā)
tap.numberOfTouchesRequired =1;
[_imageView addGestureRecognizer:tap];
三:關(guān)聯(lián)手勢的處理
問題來了。有些手勢其實是互相關(guān)聯(lián)的崭庸,例如Tap與LongPress怀浆、Swipe與Pan,或是Tap一次與Tap兩次怕享。當(dāng)一個UIView同時添加兩個相關(guān)聯(lián)的手勢時执赡,到底我這一下手指頭按的要算是Tap還是LongPress?如果照預(yù)設(shè)作法來看函筋,只要「先滿足條件」的就會跳出并呼叫對應(yīng)方法沙合,舉例來說,如果同時注冊了Pan和Swipe跌帐,只要手指頭一移動就會觸發(fā)Pan然后跳出首懈,因而永遠都不會發(fā)生Swipe;單點與雙點的情形也是一樣谨敛,永遠都只會觸發(fā)單點究履,不會有雙點。
那么這個問題有解嗎脸狸?答案是肯定的最仑,UIGestureRecognizer有個方法叫做requireGestureRecognizerToFail,他可以指定某一個recognizer炊甲,即便自己已經(jīng)滿足條件了泥彤,也不會立刻觸發(fā),會等到該指定的recognizer確定失敗之后才觸發(fā)卿啡。這是一種思想吟吝,一種優(yōu)先確定不確定的事件,根據(jù)不確定事件的反饋去執(zhí)行應(yīng)該執(zhí)行的事件牵囤。
//雙擊確定偵測失敗才會觸發(fā)單擊
[singleTap requireGestureRecognizerToFail:doubleTap];
注意:一個手勢只能關(guān)聯(lián)一個view爸黄,一個view可以關(guān)聯(lián)多個手勢
四:
//將像素point由point所在視圖轉(zhuǎn)換到目標(biāo)視圖view中,返回在目標(biāo)視圖view中的像素值
-?(CGPoint)convertPoint:(CGPoint)point?toView:(UIView?*)view;
//將像素point從view中轉(zhuǎn)換到當(dāng)前視圖中揭鳞,返回在當(dāng)前視圖中的像素值
-?(CGPoint)convertPoint:(CGPoint)point?fromView:(UIView?*)view;
//將rect由rect所在視圖轉(zhuǎn)換到目標(biāo)視圖view中炕贵,返回在目標(biāo)視圖view中的rect
-?(CGRect)convertRect:(CGRect)rect?toView:(UIView?*)view;
//將rect從view中轉(zhuǎn)換到當(dāng)前視圖中,返回在當(dāng)前視圖中的rect
-?(CGRect)convertRect:(CGRect)rect?fromView:(UIView?*)view;
例把UITableViewCell中的subview(btn)的frame轉(zhuǎn)換到controllerA中
//?controllerA中有一個UITableView,?UITableView里有多行UITableVieCell野崇,cell上放有一個button
//在controllerA中實現(xiàn):
CGRect?rc?=?[cell?convertRect:cell.btn.frame?toView:self.view];
//或
CGRect?rc?=?[self.view?convertRect:cell.btn.frame?fromView:cell];
//此rc為btn在controllerA中的rect
//或當(dāng)已知btn時:
CGRect?rc?=?[btn.superview?convertRect:btn.frame?toView:self.view];
//或
CGRect?rc?=?[self.view?convertRect:btn.frame?fromView:btn.superview];