日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UIGestureRecognizer学习笔记

發(fā)布時間:2025/4/14 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UIGestureRecognizer学习笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

UIGestureRecognizer?是一個具體手勢的基類,提供了較為簡單的手勢實現(xiàn)方式 ?

The concrete subclasses of?UIGestureRecognizer?are the following:

  • UITapGestureRecognizer

  • UIPinchGestureRecognizer

  • UIRotationGestureRecognizer

  • UISwipeGestureRecognizer

  • UIPanGestureRecognizer

  • UILongPressGestureRecognizer

一個gesture recognizer是針對一個特定的view的(包含其subview),用UIView的方法addGestureRecognize:去關(guān)聯(lián)一個view

?

一個gesture recognizer是不參與UIView的事件響應(yīng)鏈的

?

?

各個手勢使用時的代碼:

UITapGestureRecognizer

?

[cpp]?view plaincopy
  • -?(void)viewDidLoad??
  • {??
  • ????[super?viewDidLoad];??
  • ????//?Do?any?additional?setup?after?loading?the?view?from?its?nib.??
  • ??????
  • ????UITapGestureRecognizer?*tapGesture?=?[[UITapGestureRecognizer?alloc]?initWithTarget:self?action:@selector(handleGesture:)];??
  • ????if?(![tapGesture?respondsToSelector:@selector(locationInView:)])?{??
  • ????????[tapGesture?release];??
  • ????????tapGesture?=?nil;??
  • ????}else?{??
  • ????????tapGesture.delegate?=?self;??
  • ????????tapGesture.numberOfTapsRequired?=?1;?//?The?default?value?is?1.??
  • ????????tapGesture.numberOfTouchesRequired?=?1;?//?The?default?value?is?1.??
  • ????????[self.view?addGestureRecognizer:tapGesture];??
  • ????}??
  • }??
  • ?

    [cpp]?view plaincopy
  • -?(void)handleGesture:(UIGestureRecognizer?*)gestureRecognizer??
  • {??
  • ????UIView?*view?=?[gestureRecognizer?view];?//?這個view是手勢所屬的view,也就是增加手勢的那個view??
  • ??????
  • ????switch?(gestureRecognizer.state)?{??
  • ????????case?UIGestureRecognizerStateEnded:{?//?UIGestureRecognizerStateRecognized?=?UIGestureRecognizerStateEnded?//?正常情況下只響應(yīng)這個消息??
  • ????????????NSLog(@"======UIGestureRecognizerStateEnded?||?UIGestureRecognizerStateRecognized");??
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStateFailed:{?//???
  • ????????????NSLog(@"======UIGestureRecognizerStateFailed");??
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStatePossible:{?//???
  • ????????????NSLog(@"======UIGestureRecognizerStatePossible");??
  • ????????????break;??
  • ????????}??
  • ????????default:{??
  • ????????????NSLog(@"======Unknow?gestureRecognizer");??
  • ????????????break;??
  • ????????}??
  • ????}????
  • }??
  • ??
  • //?詢問一個手勢接收者是否應(yīng)該開始解釋執(zhí)行一個觸摸接收事件??
  • -?(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer?*)gestureRecognizer{??
  • //????CGPoint?currentPoint?=?[gestureRecognizer?locationInView:self.view];??
  • //????if?(CGRectContainsPoint(CGRectMake(0,?0,?100,?100),?currentPoint)?)?{??
  • //????????return?YES;??
  • //????}??
  • //??????
  • //????return?NO;??
  • ??????
  • ????return?YES;??
  • }??
  • ??
  • //?詢問delegate,兩個手勢是否同時接收消息,返回YES同事接收。返回NO,不同是接收(如果另外一個手勢返回YES,則并不能保證不同時接收消息)the?default?implementation?returns?NO。??
  • //?這個函數(shù)一般在一個手勢接收者要阻止另外一個手勢接收自己的消息的時候調(diào)用??
  • -?(BOOL)gestureRecognizer:(UIGestureRecognizer?*)gestureRecognizer?shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer?*)otherGestureRecognizer{??
  • ????return?NO;??
  • }??
  • ??
  • //?詢問delegate是否允許手勢接收者接收一個touch對象??
  • //?返回YES,則允許對這個touch對象審核,NO,則不允許。??
  • //?這個方法在touchesBegan:withEvent:之前調(diào)用,為一個新的touch對象進(jìn)行調(diào)用??
  • -?(BOOL)gestureRecognizer:(UIGestureRecognizer?*)gestureRecognizer?shouldReceiveTouch:(UITouch?*)touch{??
  • ????return?YES;??
  • }??
  • ?

    ?

    UIPinchGestureRecognizer

    ?

    [cpp]?view plaincopy
  • -?(void)viewDidLoad??
  • {??
  • ????[super?viewDidLoad];??
  • ????//?Do?any?additional?setup?after?loading?the?view?from?its?nib.??
  • ??????
  • ????UIPinchGestureRecognizer?*pinchGesture?=?[[UIPinchGestureRecognizer?alloc]?initWithTarget:self?action:@selector(handleGesture:)];??
  • ????if?(![pinchGesture?respondsToSelector:@selector(locationInView:)])?{??
  • ????????[pinchGesture?release];??
  • ????????pinchGesture?=?nil;??
  • ????}else?{??
  • ????????pinchGesture.delegate?=?self;??
  • ????????[self.view?addGestureRecognizer:?pinchGesture];??
  • ????}????
  • }??
  • ??
  • ??
  • -?(void)handleGesture:(UIPinchGestureRecognizer?*)gestureRecognizer??
  • {??
  • ??????
  • ????UIView?*view?=?[gestureRecognizer?view];?//?這個view是手勢所屬的view,也就是增加手勢的那個view??
  • ??????
  • ??????
  • ????/*?
  • ?????scale屬性:?可以理解為兩手指之間的距離,其實是個比例,相對距離,不是絕對距離?
  • ????????????????以剛開始的兩個手指對應(yīng)的兩個point的之間的距離為標(biāo)準(zhǔn),此時scale=1.?
  • ????????????????若兩手指之間距離減小,則scale不斷變小,當(dāng)兩指重合,則變?yōu)??
  • ????????????????若兩手指之間距離變大,則scale不斷增大,沒有上限,看屏幕多大?
  • ??????
  • ?????velocity屬性:?可以理解為兩手指之間的移動速度,其實是個速度比例,相對速度,不是絕對速度?
  • ????????????????以剛開始的兩個手指對應(yīng)的兩個point的之間的距離為標(biāo)準(zhǔn),此時velocity=0.?
  • ????????????????若兩手指之間距離減小,則velocity為負(fù)數(shù),從-0開始,隨著手指向里捏合的速度越快,負(fù)值越大,沒有上限,我測試了下,可以到-20.009099,甚至更大?
  • ????????????????若兩手指之間距離變大,則velocity不斷正數(shù),沒有上限,從0開始,隨著手指向外捏合的速度越快,值越大,沒有上限,我測試了下,可以到170.234663,甚至更大?
  • ????????????????注意:在這個過程中,出現(xiàn)了nan值。??
  • ?????????????????????有關(guān)NAN值的介紹如下:(http://www.cnblogs.com/konlil/archive/2011/07/06/2099646.html)?
  • ??????
  • ?????浮點異常值:NAN,QNAN,SNAN?
  • ??????
  • ?????32位浮點數(shù)在機(jī)器中的表示按照IEEE的標(biāo)準(zhǔn)是這樣的:?
  • ?????+------+----------------+-------------------------------+????
  • ?????|?1bit????|???8bit???????????????|?????????23bit????????????????????????????|????
  • ?????+------+----------------+-------------------------------+?
  • ?????其中:1bit表示符號位(0表示正,1表示負(fù)),8bit表示指數(shù)(0~255,實際指數(shù)取值還要減去127,即指數(shù)取值區(qū)間為-127~128),23bit表示尾數(shù)。?
  • ?????這里所要說的浮點異常值就是這種表示產(chǎn)生的幾種特殊值,IEEE規(guī)定根據(jù)指數(shù)和尾數(shù)的不同分別可表示如下幾種特殊值:?
  • ?????1.?零值:按上述的浮點表述形式如果指數(shù)部分全部為0,并且尾數(shù)全部為0,則表示為浮點0.0,并且規(guī)定-0?=?+0?
  • ?????2.?非規(guī)格化值:如果指數(shù)全部為0,尾數(shù)非0,則表示非規(guī)格化的值,16進(jìn)制看到的就是[80xxxxxx]h或者[00xxxxxx]h?
  • ?????3.?無窮值:如果指數(shù)全部為1,尾數(shù)全部為0,則根據(jù)符號位分別表示正無窮大和負(fù)無窮大,16進(jìn)制看到的就是[FF800000]h或者[7F800000]h?
  • ?????4.?NAN:主角來了,如果指數(shù)全部為1,尾數(shù)非0,則表示這個值不是一個真正的值(Not?A?Number)。NAN又分成兩類:QNAN(Quiet?NAN)和SNAN(Singaling?NAN)。QNAN與SNAN的不同之處在于,QNAN的尾數(shù)部分最高位定義為1,SNAN最高位定義為0;QNAN一般表示未定義的算術(shù)運算結(jié)果,最常見的莫過于除0運算;SNAN一般被用于標(biāo)記未初始化的值,以此來捕獲異常。?
  • ?????那么既然NAN不是一個真實的數(shù)值,在程序如何判斷變量是否變成了NAN呢?大部分語言中針對NAN值都有一系列的函數(shù)定義,C語言中最常見的三個函數(shù):?
  • ?????_isnan(double?x);??????????????????//判斷是否為NAN?
  • ?????_finite(double?x);??????????????????//判讀是否為無窮大?
  • ?????_fpclass(double?x);????????????????//返回一系列的定義值,如:_FPCLASS_QNAN,?_FPCLASS_SNAN,具體參考MSDN?
  • ?
  • ?????*/??
  • ????CGFloat?scale?=?gestureRecognizer.scale;??
  • ????NSLog(@"======scale:?%f",?scale);??
  • ??????
  • ????CGFloat?velocity?=?gestureRecognizer.velocity;??
  • ????NSLog(@"======scvelocityale:?%f",?velocity);??
  • ??????
  • ????/*?
  • ?????捏合手勢?
  • ??????
  • ?????這個一般情況下只響應(yīng)?
  • ?????UIGestureRecognizerStateBegan、?
  • ?????UIGestureRecognizerStateEnded?||?UIGestureRecognizerStateRecognized、?
  • ?????UIGestureRecognizerStateChanged消息,?
  • ?????一個UIGestureRecognizerStateBegan,接下去是N多的UIGestureRecognizerStateChanged,scale的值此時會不斷的變化,當(dāng)手指離開時,響應(yīng)UIGestureRecognizerStateEnded?||?UIGestureRecognizerStateRecognized?
  • ?????*/??
  • ????switch?(gestureRecognizer.state)?{??
  • ????????case?UIGestureRecognizerStateEnded:{?//?UIGestureRecognizerStateRecognized?=?UIGestureRecognizerStateEnded??
  • ????????????NSLog(@"======UIGestureRecognizerStateEnded?||?UIGestureRecognizerStateRecognized");??
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStateBegan:{?//???
  • ????????????NSLog(@"======UIGestureRecognizerStateBegan");??
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStateChanged:{?//???
  • ????????????NSLog(@"======UIGestureRecognizerStateChanged");??
  • ??????????????
  • ????????????gestureRecognizer.view.transform?=?CGAffineTransformScale(gestureRecognizer.view.transform,?gestureRecognizer.scale,?gestureRecognizer.scale);??
  • ????????????gestureRecognizer.scale?=?1;?//?重置,很重要!!!??
  • ??????????????
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStateCancelled:{?//???
  • ????????????NSLog(@"======UIGestureRecognizerStateCancelled");??
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStateFailed:{?//???
  • ????????????NSLog(@"======UIGestureRecognizerStateFailed");??
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStatePossible:{?//???
  • ????????????NSLog(@"======UIGestureRecognizerStatePossible");??
  • ????????????break;??
  • ????????}??
  • ????????default:{??
  • ????????????NSLog(@"======Unknow?gestureRecognizer");??
  • ????????????break;??
  • ????????}??
  • ????}????
  • }??
  • ?

    ?

    UIRotationGestureRecognizer

    ?

    [cpp]?view plaincopy
  • -?(void)viewDidLoad??
  • {??
  • ????[super?viewDidLoad];??
  • ????//?Do?any?additional?setup?after?loading?the?view?from?its?nib.??
  • ????UIRotationGestureRecognizer?*rotationGesture?=?[[UIRotationGestureRecognizer?alloc]?initWithTarget:self?action:@selector(handleGesture:)];??
  • ????if?(![rotationGesture?respondsToSelector:@selector(locationInView:)])?{??
  • ????????[rotationGesture?release];??
  • ????????rotationGesture?=?nil;??
  • ????}else?{??
  • ????????rotationGesture.delegate?=?self;??
  • ??????????
  • ????????[self.view?addGestureRecognizer:rotationGesture];??
  • ????}??
  • }??
  • ??
  • ??
  • -?(void)handleGesture:(UIRotationGestureRecognizer?*)gestureRecognizer??
  • {??
  • ????UIView?*view?=?[gestureRecognizer?view];?//?這個view是手勢所屬的view,也就是增加手勢的那個view??
  • ??????
  • ??????
  • ????/*?
  • ?????rotation屬性:?可以理解為兩手指之間的旋轉(zhuǎn)的角度,其實是個比例,相對角度,不是絕對角度?
  • ?????以剛開始的兩個手指對應(yīng)的兩個point的之間的那條直線為標(biāo)準(zhǔn),此時rotation=1.?
  • ?????向順時針旋轉(zhuǎn),則rotation為正數(shù)且不斷變大,當(dāng)旋轉(zhuǎn)360度時,rotation大概為6左右,如果繼續(xù)順時針旋轉(zhuǎn),則角度會不斷增加,兩圈為12左右,此時若逆時針旋轉(zhuǎn),角度則不斷變小?
  • ?????向逆時針旋轉(zhuǎn),則rotation為負(fù)數(shù)且不斷變小,當(dāng)旋轉(zhuǎn)360度時,rotation大概為-6左右?
  • ??????
  • ?????velocity屬性:?可以理解為兩手指之間的移動速度,其實是個速度比例,相對速度,不是絕對速度?
  • ?????以剛開始的兩個手指對應(yīng)的兩個point的之間的距離為標(biāo)準(zhǔn),此時velocity=0.?
  • ?????若兩手指向順時針旋轉(zhuǎn),則velocity為正數(shù),從0開始,隨著手指向里捏合的速度越快,值越大,沒有上限?
  • ?????若兩手指向逆時針旋轉(zhuǎn),則velocity為負(fù)數(shù)數(shù),沒有上限,從-0開始,隨著手指向外捏合的速度越快,值越小,沒有上限?
  • ?????*/??
  • ????CGFloat?rotation?=?gestureRecognizer.rotation;??
  • ????NSLog(@"===rotation:?%f",?rotation);??
  • ??????
  • ????CGFloat?velocity?=?gestureRecognizer.velocity;??
  • ????NSLog(@"======velocity:?%f",?velocity);??
  • ??????
  • ??????
  • ??????
  • ????/*?
  • ?????旋轉(zhuǎn)手勢?
  • ??????
  • ?????這個一般情況下只響應(yīng)?
  • ?????UIGestureRecognizerStateBegan、?
  • ?????UIGestureRecognizerStateEnded?||?UIGestureRecognizerStateRecognized、?
  • ?????UIGestureRecognizerStateChanged消息,?
  • ?????一個UIGestureRecognizerStateBegan,接下去是N多的UIGestureRecognizerStateChanged,scale的值此時會不斷的變化,當(dāng)手指離開時,響應(yīng)UIGestureRecognizerStateEnded?||?UIGestureRecognizerStateRecognized?
  • ?????*/??
  • ????switch?(gestureRecognizer.state)?{??
  • ????????case?UIGestureRecognizerStateEnded:{?//?UIGestureRecognizerStateRecognized?=?UIGestureRecognizerStateEnded??
  • ????????????NSLog(@"======UIGestureRecognizerStateEnded?||?UIGestureRecognizerStateRecognized");??
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStateBegan:{?//???
  • ????????????NSLog(@"======UIGestureRecognizerStateBegan");??
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStateChanged:{?//???
  • ????????????NSLog(@"======UIGestureRecognizerStateChanged");??
  • ??????????????
  • ????????????gestureRecognizer.view.transform?=?CGAffineTransformRotate(gestureRecognizer.view.transform,?gestureRecognizer.rotation);??
  • ????????????gestureRecognizer.rotation?=?0;?//?重置?這個相當(dāng)重要!!!???
  • ??????????????
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStateCancelled:{?//???
  • ????????????NSLog(@"======UIGestureRecognizerStateCancelled");??
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStateFailed:{?//???
  • ????????????NSLog(@"======UIGestureRecognizerStateFailed");??
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStatePossible:{?//???
  • ????????????NSLog(@"======UIGestureRecognizerStatePossible");??
  • ????????????break;??
  • ????????}??
  • ????????default:{??
  • ????????????NSLog(@"======Unknow?gestureRecognizer");??
  • ????????????break;??
  • ????????}??
  • ????}????
  • }??
  • ?

    UISwipeGestureRecognizer

    ?

    [cpp]?view plaincopy
  • -?(void)viewDidLoad??
  • {??
  • ????[super?viewDidLoad];??
  • ????//?Do?any?additional?setup?after?loading?the?view?from?its?nib.??
  • ??????
  • ????/*?
  • ?????同一個手勢只能指定一個方向,不能同時指定多個方向,要指定多個方向?必須用多個手勢?
  • ?????*/??
  • ??????
  • ????//?right??
  • ????UISwipeGestureRecognizer?*swipeGestureRight?=?[[UISwipeGestureRecognizer?alloc]?initWithTarget:self?action:@selector(handleGesture:)];??
  • ????if?(![swipeGestureRight?respondsToSelector:@selector(locationInView:)])?{??
  • ????????[swipeGestureRight?release];??
  • ????????swipeGestureRight?=?nil;??
  • ????}else?{??
  • ????????swipeGestureRight.delegate?=?self;??
  • ????????swipeGestureRight.numberOfTouchesRequired?=?1;//?手指個數(shù)?The?default?value?is?1.??
  • ????????swipeGestureRight.direction?=?UISwipeGestureRecognizerDirectionRight;//?同一個手勢只能指定一個方向,不能同時指定多個方向,要指定多個方向?必須用多個手勢??
  • ????????[self.view?addGestureRecognizer:swipeGestureRight];??
  • ????}??
  • ??????
  • ????//?left??
  • ????UISwipeGestureRecognizer?*swipeGestureLeft?=?[[UISwipeGestureRecognizer?alloc]?initWithTarget:self?action:@selector(handleGesture:)];??
  • ????if?(![swipeGestureLeft?respondsToSelector:@selector(locationInView:)])?{??
  • ????????[swipeGestureLeft?release];??
  • ????????swipeGestureLeft?=?nil;??
  • ????}else?{??
  • ????????swipeGestureLeft.delegate?=?self;??
  • ????????swipeGestureLeft.numberOfTouchesRequired?=?1;//?手指個數(shù)?The?default?value?is?1.??
  • ????????swipeGestureLeft.direction?=?UISwipeGestureRecognizerDirectionLeft;//?同一個手勢只能指定一個方向,不能同時指定多個方向,要指定多個方向?必須用多個手勢??
  • ????????[self.view?addGestureRecognizer:swipeGestureLeft];??
  • ????}??
  • ??????
  • ????//?Up??
  • ????UISwipeGestureRecognizer?*swipeGestureUp?=?[[UISwipeGestureRecognizer?alloc]?initWithTarget:self?action:@selector(handleGesture:)];??
  • ????if?(![swipeGestureUp?respondsToSelector:@selector(locationInView:)])?{??
  • ????????[swipeGestureUp?release];??
  • ????????swipeGestureUp?=?nil;??
  • ????}else?{??
  • ????????swipeGestureUp.delegate?=?self;??
  • ????????swipeGestureUp.numberOfTouchesRequired?=?1;//?手指個數(shù)?The?default?value?is?1.??
  • ????????swipeGestureUp.direction?=?UISwipeGestureRecognizerDirectionUp;//?同一個手勢只能指定一個方向,不能同時指定多個方向,要指定多個方向?必須用多個手勢??
  • ????????[self.view?addGestureRecognizer:swipeGestureUp];??
  • ????}??
  • ??????
  • ????//?Down??
  • ????UISwipeGestureRecognizer?*swipeGestureDown?=?[[UISwipeGestureRecognizer?alloc]?initWithTarget:self?action:@selector(handleGesture:)];??
  • ????if?(![swipeGestureDown?respondsToSelector:@selector(locationInView:)])?{??
  • ????????[swipeGestureDown?release];??
  • ????????swipeGestureDown?=?nil;??
  • ????}else?{??
  • ????????swipeGestureDown.delegate?=?self;??
  • ????????swipeGestureDown.numberOfTouchesRequired?=?1;//?手指個數(shù)?The?default?value?is?1.??
  • ????????swipeGestureDown.direction?=?UISwipeGestureRecognizerDirectionDown;//?同一個手勢只能指定一個方向,不能同時指定多個方向,要指定多個方向?必須用多個手勢??
  • ????????[self.view?addGestureRecognizer:swipeGestureDown];??
  • ????}??
  • }??
  • ??
  • -?(void)handleGesture:(UISwipeGestureRecognizer?*)gestureRecognizer??
  • {??
  • ????UIView?*view?=?[gestureRecognizer?view];?//?這個view是手勢所屬的view,也就是增加手勢的那個view??
  • ??????
  • ????/*?
  • ?????direction屬性:?用來指明手勢滑動的方向的。?
  • ?????*/??
  • ????UISwipeGestureRecognizerDirection?direction?=?gestureRecognizer.direction;??
  • ????switch?(direction)?{??
  • ????????case?UISwipeGestureRecognizerDirectionRight:??
  • ????????{??
  • ????????????NSLog(@"direction==UISwipeGestureRecognizerDirectionRight");??
  • ????????????break;??
  • ????????}??
  • ????????case?UISwipeGestureRecognizerDirectionLeft:??
  • ????????{??
  • ????????????NSLog(@"direction==UISwipeGestureRecognizerDirectionLeft");??
  • ????????????break;??
  • ????????}??
  • ????????case?UISwipeGestureRecognizerDirectionUp:??
  • ????????{??
  • ????????????NSLog(@"direction==UISwipeGestureRecognizerDirectionUp");??
  • ????????????break;??
  • ????????}??
  • ????????case?UISwipeGestureRecognizerDirectionDown:??
  • ????????{??
  • ????????????NSLog(@"direction==UISwipeGestureRecognizerDirectionDown");??
  • ????????????break;??
  • ????????}??
  • ????????default:??
  • ????????????break;??
  • ????}??
  • ??????
  • ??????
  • ????/*?
  • ?????輕掃手勢?
  • ??????
  • ?????這個一般情況下只響應(yīng)UIGestureRecognizerStateEnded?||?UIGestureRecognizerStateRecognized?
  • ?????*/??
  • ????switch?(gestureRecognizer.state)?{??
  • ????????case?UIGestureRecognizerStateEnded:{?//?UIGestureRecognizerStateRecognized?=?UIGestureRecognizerStateEnded??
  • ????????????NSLog(@"======UIGestureRecognizerStateEnded?||?UIGestureRecognizerStateRecognized");??
  • ????????????break;??
  • ????????}??
  • ????????default:{??
  • ????????????NSLog(@"======Unknow?gestureRecognizer");??
  • ????????????break;??
  • ????????}??
  • ????}????
  • }??
  • ?

    ?

    UIPanGestureRecognizer

    ?

    [cpp]?view plaincopy
  • -?(void)viewDidLoad??
  • {??
  • ????[super?viewDidLoad];??
  • ????//?Do?any?additional?setup?after?loading?the?view?from?its?nib.??
  • ??????
  • ????UIView?*view?=?[[UIView?alloc]initWithFrame:CGRectMake(0,?0,?100,?100)];??
  • ????view.backgroundColor?=?[UIColor?blueColor];??
  • ????[self.view?addSubview:view];??
  • ??????
  • ??????
  • ????UIPanGestureRecognizer?*panPressGesture?=?[[UIPanGestureRecognizer?alloc]?initWithTarget:self?action:@selector(handleGesture:)];??
  • ????if?(![panPressGesture?respondsToSelector:@selector(locationInView:)])?{??
  • ????????[panPressGesture?release];??
  • ????????panPressGesture?=?nil;??
  • ????}else?{??
  • ????????panPressGesture.delegate?=?self;??
  • ????????panPressGesture.maximumNumberOfTouches?=?NSUIntegerMax;//?The?default?value?is?NSUIntegerMax.???
  • ????????/*?
  • ?????????NSUIntegerMax?:?The?maximum?value?for?an?NSUInteger.?
  • ?????????*/??
  • ????????panPressGesture.minimumNumberOfTouches?=?1;//?The?default?value?is?1.??
  • ????????[view?addGestureRecognizer:panPressGesture];??
  • ????}??
  • }??
  • ??
  • //?拖拽手勢??
  • -?(void)handleGesture:(UIPanGestureRecognizer?*)gestureRecognizer??
  • {??
  • ????UIView?*view?=?[gestureRecognizer?view];?//?這個view是手勢所屬的view,也就是增加手勢的那個view??
  • ??
  • ??????
  • ??????
  • ????switch?(gestureRecognizer.state)?{??
  • ????????case?UIGestureRecognizerStateBegan:{???
  • ????????????NSLog(@"======UIGestureRecognizerStateBegan");??
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStateChanged:{???
  • ????????????NSLog(@"======UIGestureRecognizerStateChanged");??
  • ??????????????
  • ????????????/*?
  • ?????????????讓view跟著手指移動?
  • ??????????????
  • ?????????????1.獲取每次系統(tǒng)捕獲到的手指移動的偏移量translation?
  • ?????????????2.根據(jù)偏移量translation算出當(dāng)前view應(yīng)該出現(xiàn)的位置?
  • ?????????????3.設(shè)置view的新frame?
  • ?????????????4.將translation重置為0(十分重要。否則translation每次都會疊加,很快你的view就會移除屏幕!)?
  • ?????????????*/??
  • ??????????????
  • ????????????CGPoint?translation?=?[gestureRecognizer?translationInView:self.view];??
  • ????????????view.center?=?CGPointMake(gestureRecognizer.view.center.x?+?translation.x,?gestureRecognizer.view.center.y?+?translation.y);??
  • ????????????[gestureRecognizer?setTranslation:CGPointMake(0,?0)?inView:self.view];//??注意一旦你完成上述的移動,將translation重置為0十分重要。否則translation每次都會疊加,很快你的view就會移除屏幕!??
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStateCancelled:{???
  • ????????????NSLog(@"======UIGestureRecognizerStateCancelled");??
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStateFailed:{???
  • ????????????NSLog(@"======UIGestureRecognizerStateFailed");??
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStatePossible:{???
  • ????????????NSLog(@"======UIGestureRecognizerStatePossible");??
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStateEnded:{?//?UIGestureRecognizerStateRecognized?=?UIGestureRecognizerStateEnded??
  • ??????????????
  • ????????????/*?
  • ?????????????當(dāng)手勢結(jié)束后,view的減速緩沖效果?
  • ??????????????
  • ?????????????模擬減速寫的一個很簡單的方法。它遵循如下策略:?
  • ?????????????計算速度向量的長度(i.e.?magnitude)?
  • ?????????????如果長度小于200,則減少基本速度,否則增加它。?
  • ?????????????基于速度和滑動因子計算終點?
  • ?????????????確定終點在視圖邊界內(nèi)?
  • ?????????????讓視圖使用動畫到達(dá)最終的靜止點?
  • ?????????????使用“Ease?out“動畫參數(shù),使運動速度隨著時間降低?
  • ?????????????*/??
  • ??????????????
  • ????????????NSLog(@"======UIGestureRecognizerStateEnded?||?UIGestureRecognizerStateRecognized");??
  • ??????????????
  • ????????????CGPoint?velocity?=?[gestureRecognizer?velocityInView:self.view];//?分別得出x,y軸方向的速度向量長度(velocity代表按照當(dāng)前速度,每秒可移動的像素個數(shù),分xy軸兩個方向)??
  • ????????????CGFloat?magnitude?=?sqrtf((velocity.x?*?velocity.x)?+?(velocity.y?*?velocity.y));//?根據(jù)直角三角形的算法算出綜合速度向量長度??
  • ??????????????
  • ????????????//?如果長度小于200,則減少基本速度,否則增加它。??
  • ????????????CGFloat?slideMult?=?magnitude?/?200;??
  • ??????????????
  • ????????????NSLog(@"magnitude:?%f,?slideMult:?%f",?magnitude,?slideMult);??
  • ????????????float?slideFactor?=?0.1?*?slideMult;?//?Increase?for?more?of?a?slide??
  • ??????????????
  • ????????????//?基于速度和滑動因子計算終點??
  • ????????????CGPoint?finalPoint?=?CGPointMake(view.center.x?+?(velocity.x?*?slideFactor),??
  • ?????????????????????????????????????????????view.center.y?+?(velocity.y?*?slideFactor));??
  • ??????????????
  • ????????????//?確定終點在視圖邊界內(nèi)??
  • ????????????finalPoint.x?=?MIN(MAX(finalPoint.x,?0),?self.view.bounds.size.width);??
  • ????????????finalPoint.y?=?MIN(MAX(finalPoint.y,?0),?self.view.bounds.size.height);??
  • ??????????????
  • ????????????[UIView?animateWithDuration:slideFactor*2?delay:0?options:UIViewAnimationOptionCurveEaseOut?animations:^{??
  • ????????????????view.center?=?finalPoint;????
  • ????????????}?completion:nil];??
  • ??????????????
  • ????????????break;??
  • ????????}??
  • ????????default:{??
  • ????????????NSLog(@"======Unknow?gestureRecognizer");??
  • ????????????break;??
  • ????????}??
  • ????}????
  • }??
  • ?

    ?

    UILongPressGestureRecognizer

    ?

    [cpp]?view plaincopy
  • -?(void)viewDidLoad??
  • {??
  • ????[super?viewDidLoad];??
  • ????//?Do?any?additional?setup?after?loading?the?view?from?its?nib.??
  • ????UILongPressGestureRecognizer?*longPressGesture?=?[[UILongPressGestureRecognizer?alloc]?initWithTarget:self?action:@selector(handleGesture:)];??
  • ????if?(![longPressGesture?respondsToSelector:@selector(locationInView:)])?{??
  • ????????[longPressGesture?release];??
  • ????????longPressGesture?=?nil;??
  • ????}else?{??
  • ????????longPressGesture.delegate?=?self;??
  • ????????longPressGesture.numberOfTapsRequired?=?0;??????//?The?default?number?of?taps?is?0.??
  • ????????longPressGesture.minimumPressDuration?=?0.1f;????//?The?default?duration?is?is?0.5?seconds.??
  • ????????longPressGesture.numberOfTouchesRequired?=?1;???//?The?default?number?of?fingers?is?1.??
  • ????????longPressGesture.allowableMovement?=?10;????????//?The?default?distance?is?10?pixels.??
  • ????????[self.view?addGestureRecognizer:longPressGesture];??
  • ????}??
  • }??
  • ??
  • ??
  • -?(void)handleGesture:(UIGestureRecognizer?*)gestureRecognizer??
  • {??
  • ????UIView?*view?=?[gestureRecognizer?view];?//?這個view是手勢所屬的view,也就是增加手勢的那個view??
  • ??????
  • ????switch?(gestureRecognizer.state)?{??
  • ????????case?UIGestureRecognizerStateEnded:{?//?UIGestureRecognizerStateRecognized?=?UIGestureRecognizerStateEnded??
  • ????????????NSLog(@"======UIGestureRecognizerStateEnded?||?UIGestureRecognizerStateRecognized");??
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStateBegan:{?//???
  • ????????????NSLog(@"======UIGestureRecognizerStateBegan");??
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStateChanged:{?//???
  • ????????????NSLog(@"======UIGestureRecognizerStateChanged");??
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStateCancelled:{?//???
  • ????????????NSLog(@"======UIGestureRecognizerStateCancelled");??
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStateFailed:{?//???
  • ????????????NSLog(@"======UIGestureRecognizerStateFailed");??
  • ????????????break;??
  • ????????}??
  • ????????case?UIGestureRecognizerStatePossible:{?//???
  • ????????????NSLog(@"======UIGestureRecognizerStatePossible");??
  • ????????????break;??
  • ????????}??
  • ????????default:{??
  • ????????????NSLog(@"======Unknow?gestureRecognizer");??
  • ????????????break;??
  • ????????}??
  • ????}????
  • }??
  • ??
  • //?詢問一個手勢接收者是否應(yīng)該開始解釋執(zhí)行一個觸摸接收事件??
  • -?(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer?*)gestureRecognizer{??
  • ????CGPoint?currentPoint?=?[gestureRecognizer?locationInView:self.view];??
  • ????if?(CGRectContainsPoint(CGRectMake(0,?0,?100,?100),?currentPoint)?)?{??
  • ????????return?YES;??
  • ????}??
  • ??????
  • ????return?NO;??
  • }??
  • ??
  • //?詢問delegate,兩個手勢是否同時接收消息,返回YES同事接收。返回NO,不同是接收(如果另外一個手勢返回YES,則并不能保證不同時接收消息)the?default?implementation?returns?NO。??
  • //?這個函數(shù)一般在一個手勢接收者要阻止另外一個手勢接收自己的消息的時候調(diào)用??
  • -?(BOOL)gestureRecognizer:(UIGestureRecognizer?*)gestureRecognizer?shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer?*)otherGestureRecognizer{??
  • ????return?NO;??
  • }??
  • ??
  • //?詢問delegate是否允許手勢接收者接收一個touch對象??
  • //?返回YES,則允許對這個touch對象審核,NO,則不允許。??
  • //?這個方法在touchesBegan:withEvent:之前調(diào)用,為一個新的touch對象進(jìn)行調(diào)用??
  • -?(BOOL)gestureRecognizer:(UIGestureRecognizer?*)gestureRecognizer?shouldReceiveTouch:(UITouch?*)touch{??
  • ????return?YES;??
  • }??
  • 轉(zhuǎn)載于:https://www.cnblogs.com/Sucri/p/4704933.html

    《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

    以上是生活随笔為你收集整理的UIGestureRecognizer学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。