• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            面對現(xiàn)實(shí),超越自己
            逆水行舟,不進(jìn)則退
            posts - 269,comments - 32,trackbacks - 0

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

            The concrete subclasses of UIGestureRecognizer are the following:

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

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

            各個(gè)手勢使用時(shí)的代碼:

            UITapGestureRecognizer

            - (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];
                }
            }


            - (
            void)handleGesture:(UIGestureRecognizer *)gestureRecognizer
            {
                UIView *view = [gestureRecognizer view]; // 這個(gè)view是手勢所屬的view,也就是增加手勢的那個(gè)view
                
                switch (gestureRecognizer.state) {
                    case UIGestureRecognizerStateEnded:{ // UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // 正常情況下只響應(yīng)這個(gè)消息
                        NSLog(@"======UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized");
                        break;
                    }
                    case UIGestureRecognizerStateFailed:{ // 
                        NSLog(@"======UIGestureRecognizerStateFailed");
                        break;
                    }
                    case UIGestureRecognizerStatePossible:{ // 
                        NSLog(@"======UIGestureRecognizerStatePossible");
                        break;
                    }
                    default:{
                        NSLog(@"======Unknow gestureRecognizer");
                        break;
                    }
                }  
            }

            // 詢問一個(gè)手勢接收者是否應(yīng)該開始解釋執(zhí)行一個(gè)觸摸接收事件
            - (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,兩個(gè)手勢是否同時(shí)接收消息,返回YES同事接收。返回NO,不同是接收(如果另外一個(gè)手勢返回YES,則并不能保證不同時(shí)接收消息)the default implementation returns NO。
            // 這個(gè)函數(shù)一般在一個(gè)手勢接收者要阻止另外一個(gè)手勢接收自己的消息的時(shí)候調(diào)用
            - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
            {

                return NO;
            }

            // 詢問delegate是否允許手勢接收者接收一個(gè)touch對象
            // 返回YES,則允許對這個(gè)touch對象審核,NO,則不允許。
            // 這個(gè)方法在touchesBegan:withEvent:之前調(diào)用,為一個(gè)新的touch對象進(jìn)行調(diào)用
            - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
                return YES;
            }


            其他引用:

            - (void)viewDidLoad
            {
                
            //單指單擊
                UITapGestureRecognizer *singleFingerOne = [[UITapGestureRecognizer alloc] initWithTarget:self 
            action:@selector(handleSingleFingerEvent:)];
                singleFingerOne.numberOfTouchesRequired = 1//手指數(shù)
                singleFingerOne.numberOfTapsRequired = 1;    //tap次數(shù)
                singleFingerOne.delegate = self;

                
            //單指雙擊
                UITapGestureRecognizer *singleFingerTwo = [[UITapGestureRecognizer alloc] initWithTarget:self 
            action:@selector(handleSingleFingerEvent:)];
                singleFingerTwo.numberOfTouchesRequired = 1;
                singleFingerTwo.numberOfTapsRequired = 2;
                singleFingerTwo.delegate = self;

                
            //雙指單擊
                UITapGestureRecognizer *doubleFingerOne = [[UITapGestureRecognizer alloc] initWithTarget:self 
            action:@selector(handleDoubleFingerEvent:)];
                doubleFingerOne.numberOfTouchesRequired = 2;
                doubleFingerOne.numberOfTapsRequired = 1;
                doubleFingerOne.delegate = self;

                UITapGestureRecognizer *doubleFingerTwo = [[UITapGestureRecognizer alloc] initWithTarget:self 
            action:@selector(handleDoubleFingerEvent:)];
                doubleFingerTwo.numberOfTouchesRequired = 2;
                doubleFingerTwo.numberOfTapsRequired = 2;
                doubleFingerTwo.delegate = self;

                
            //如果不加下面的話,當(dāng)單指雙擊時(shí),會先調(diào)用單指單擊中的處理,再調(diào)用單指雙擊中的處理
                [singleFingerOne requireGestureRecognizerToFail:singleFingerTwo];
                
            //同理雙指亦是如此
                [doubleFingerOne requireGestureRecognizerToFail:doubleFingerTwo];

                [self.view addGestureRecognizer:singleFingerOne];
                [self.view addGestureRecognizer:singleFingerTwo];
                [self.view addGestureRecognizer:doubleFingerOne];
                [self.view addGestureRecognizer:doubleFingerTwo];
            }

            //處理單指事件
            - (void)handleSingleFingerEvent:(UITapGestureRecognizer *)sender
            {
                
            if (sender.numberOfTapsRequired == 1
                {
                    
            //單指單擊
                    NSLog(@"單指單擊");
                }
                
            else if(sender.numberOfTapsRequired == 2)
                {
                    
            //單指雙擊
                    NSLog(@"單指雙擊");
                }
            }
            //處理雙指事件
            - (void)handleDoubleFingerEvent:(UITapGestureRecognizer *)sender
            {
                
            if (sender.numberOfTapsRequired == 1
                {
                    
            //雙指單擊
                    NSLog(@"雙指單擊");
                }
                
            else if(sender.numberOfTapsRequired == 2)
                {
                    
            //雙指雙擊
                    NSLog(@"雙指雙擊");
                }
            }


            UIPinchGestureRecognizer

            - (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]; // 這個(gè)view是手勢所屬的view,也就是增加手勢的那個(gè)view 
               
                
            /*
                 scale屬性: 可以理解為兩手指之間的距離,其實(shí)是個(gè)比例,相對距離,不是絕對距離
                            以剛開始的兩個(gè)手指對應(yīng)的兩個(gè)point的之間的距離為標(biāo)準(zhǔn),此時(shí)scale=1.
                            若兩手指之間距離減小,則scale不斷變小,當(dāng)兩指重合,則變?yōu)?
                            若兩手指之間距離變大,則scale不斷增大,沒有上限,看屏幕多大
                 
                 velocity屬性: 可以理解為兩手指之間的移動速度,其實(shí)是個(gè)速度比例,相對速度,不是絕對速度
                            以剛開始的兩個(gè)手指對應(yīng)的兩個(gè)point的之間的距離為標(biāo)準(zhǔn),此時(shí)velocity=0.
                            若兩手指之間距離減小,則velocity為負(fù)數(shù),從-0開始,隨著手指向里捏合的速度越快,負(fù)值越大,沒有上限,我測試了下,可以到-20.009099,甚至更大
                            若兩手指之間距離變大,則velocity不斷正數(shù),沒有上限,從0開始,隨著手指向外捏合的速度越快,值越大,沒有上限,我測試了下,可以到170.234663,甚至更大
                            注意:在這個(gè)過程中,出現(xiàn)了nan值。 
                                 有關(guān)NAN值的介紹如下:(http://www.cnblogs.com/konlil/archive/2011/07/06/2099646.html
                 
                 浮點(diǎn)異常值:NAN,QNAN,SNAN
                 
                 32位浮點(diǎn)數(shù)在機(jī)器中的表示按照IEEE的標(biāo)準(zhǔn)是這樣的:
                 +------+----------------+-------------------------------+   
                 | 1bit    |   8bit               |         23bit                            |   
                 +------+----------------+-------------------------------+
                 其中:1bit表示符號位(0表示正,1表示負(fù)),8bit表示指數(shù)(0~255,實(shí)際指數(shù)取值還要減去127,即指數(shù)取值區(qū)間為-127~128),23bit表示尾數(shù)。
                 這里所要說的浮點(diǎn)異常值就是這種表示產(chǎn)生的幾種特殊值,IEEE規(guī)定根據(jù)指數(shù)和尾數(shù)的不同分別可表示如下幾種特殊值:
                 1. 零值:按上述的浮點(diǎn)表述形式如果指數(shù)部分全部為0,并且尾數(shù)全部為0,則表示為浮點(diǎn)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,則表示這個(gè)值不是一個(gè)真正的值(Not A Number)。NAN又分成兩類:QNAN(Quiet NAN)和SNAN(Singaling NAN)。QNAN與SNAN的不同之處在于,QNAN的尾數(shù)部分最高位定義為1,SNAN最高位定義為0;QNAN一般表示未定義的算術(shù)運(yùn)算結(jié)果,最常見的莫過于除0運(yùn)算;SNAN一般被用于標(biāo)記未初始化的值,以此來捕獲異常。
                 那么既然NAN不是一個(gè)真實(shí)的數(shù)值,在程序如何判斷變量是否變成了NAN呢?大部分語言中針對NAN值都有一系列的函數(shù)定義,C語言中最常見的三個(gè)函數(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);
                
                
            /*
                 捏合手勢

                 這個(gè)一般情況下只響應(yīng)
                 UIGestureRecognizerStateBegan、
                 UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized、
                 UIGestureRecognizerStateChanged消息,
                 一個(gè)UIGestureRecognizerStateBegan,接下去是N多的UIGestureRecognizerStateChanged,scale的值此時(shí)會不斷的變化,當(dāng)手指離開時(shí),響應(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// 重置,很重要?。。?/span>
                        
                        
            break;
                    }
                    
            case UIGestureRecognizerStateCancelled:{ // 
                        NSLog(@"======UIGestureRecognizerStateCancelled");
                        
            break;
                    }
                    
            case UIGestureRecognizerStateFailed:{ // 
                        NSLog(@"======UIGestureRecognizerStateFailed");
                        
            break;
                    }
                    
            case UIGestureRecognizerStatePossible:{ // 
                        NSLog(@"======UIGestureRecognizerStatePossible");
                        
            break;
                    }
                    
            default:{
                        NSLog(@"======Unknow gestureRecognizer");
                        
            break;
                    }
                }  
            }

             
            UIRotationGestureRecognizer

            - (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]; // 這個(gè)view是手勢所屬的view,也就是增加手勢的那個(gè)view
                
                
            /*
                 rotation屬性: 可以理解為兩手指之間的旋轉(zhuǎn)的角度,其實(shí)是個(gè)比例,相對角度,不是絕對角度
                 以剛開始的兩個(gè)手指對應(yīng)的兩個(gè)point的之間的那條直線為標(biāo)準(zhǔn),此時(shí)rotation=1.
                 向順時(shí)針旋轉(zhuǎn),則rotation為正數(shù)且不斷變大,當(dāng)旋轉(zhuǎn)360度時(shí),rotation大概為6左右,如果繼續(xù)順時(shí)針旋轉(zhuǎn),則角度會不斷增加,兩圈為12左右,此時(shí)若逆時(shí)針旋轉(zhuǎn),角度則不斷變小
                 向逆時(shí)針旋轉(zhuǎn),則rotation為負(fù)數(shù)且不斷變小,當(dāng)旋轉(zhuǎn)360度時(shí),rotation大概為-6左右
                 
                 velocity屬性: 可以理解為兩手指之間的移動速度,其實(shí)是個(gè)速度比例,相對速度,不是絕對速度
                 以剛開始的兩個(gè)手指對應(yīng)的兩個(gè)point的之間的距離為標(biāo)準(zhǔn),此時(shí)velocity=0.
                 若兩手指向順時(shí)針旋轉(zhuǎn),則velocity為正數(shù),從0開始,隨著手指向里捏合的速度越快,值越大,沒有上限
                 若兩手指向逆時(shí)針旋轉(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)手勢
                 
                 這個(gè)一般情況下只響應(yīng)
                 UIGestureRecognizerStateBegan、
                 UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized、
                 UIGestureRecognizerStateChanged消息,
                 一個(gè)UIGestureRecognizerStateBegan,接下去是N多的UIGestureRecognizerStateChanged,scale的值此時(shí)會不斷的變化,當(dāng)手指離開時(shí),響應(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// 重置 這個(gè)相當(dāng)重要?。?! 
                        
                        
            break;
                    }
                    
            case UIGestureRecognizerStateCancelled:{ // 
                        NSLog(@"======UIGestureRecognizerStateCancelled");
                        
            break;
                    }
                    
            case UIGestureRecognizerStateFailed:{ // 
                        NSLog(@"======UIGestureRecognizerStateFailed");
                        
            break;
                    }
                    
            case UIGestureRecognizerStatePossible:{ // 
                        NSLog(@"======UIGestureRecognizerStatePossible");
                        
            break;
                    }
                    
            default:{
                        NSLog(@"======Unknow gestureRecognizer");
                        
            break;
                    }
                }  
            }

             

            UISwipeGestureRecognizer

            - (void)viewDidLoad
            {
                [super viewDidLoad];
                
            // Do any additional setup after loading the view from its nib.
                
                
            /*
                 同一個(gè)手勢只能指定一個(gè)方向,不能同時(shí)指定多個(gè)方向,要指定多個(gè)方向 必須用多個(gè)手勢
                 
            */
                
                
            // 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;// 手指個(gè)數(shù) The default value is 1.
                    swipeGestureRight.direction = UISwipeGestureRecognizerDirectionRight;// 同一個(gè)手勢只能指定一個(gè)方向,不能同時(shí)指定多個(gè)方向,要指定多個(gè)方向 必須用多個(gè)手勢
                    [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;// 手指個(gè)數(shù) The default value is 1.
                    swipeGestureLeft.direction = UISwipeGestureRecognizerDirectionLeft;// 同一個(gè)手勢只能指定一個(gè)方向,不能同時(shí)指定多個(gè)方向,要指定多個(gè)方向 必須用多個(gè)手勢
                    [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;// 手指個(gè)數(shù) The default value is 1.
                    swipeGestureUp.direction = UISwipeGestureRecognizerDirectionUp;// 同一個(gè)手勢只能指定一個(gè)方向,不能同時(shí)指定多個(gè)方向,要指定多個(gè)方向 必須用多個(gè)手勢
                    [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;// 手指個(gè)數(shù) The default value is 1.
                    swipeGestureDown.direction = UISwipeGestureRecognizerDirectionDown;// 同一個(gè)手勢只能指定一個(gè)方向,不能同時(shí)指定多個(gè)方向,要指定多個(gè)方向 必須用多個(gè)手勢
                    [self.view addGestureRecognizer:swipeGestureDown];
                }
            }

            - (void)handleGesture:(UISwipeGestureRecognizer *)gestureRecognizer
            {
                UIView *view = [gestureRecognizer view]; // 這個(gè)view是手勢所屬的view,也就是增加手勢的那個(gè)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;
                }
                
                
            /*
                 輕掃手勢
                 
                 這個(gè)一般情況下只響應(yīng)UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized
                 
            */
                
            switch (gestureRecognizer.state) {
                    
            case UIGestureRecognizerStateEnded:{ // UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded
                        NSLog(@"======UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized");
                        
            break;
                    }
                    
            default:{
                        NSLog(@"======Unknow gestureRecognizer");
                        
            break;
                    }
                }  
            }

             
            UIPanGestureRecognizer

            - (void)viewDidLoad
            {
                [super viewDidLoad];
                
            // Do any additional setup after loading the view from its nib.
                
                UIView *view = [[UIView alloc]initWithFrame:CGRectMake(00100100)];
                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]; // 這個(gè)view是手勢所屬的view,也就是增加手勢的那個(gè)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就會移除屏幕?。?br />             */
                        
                        CGPoint translation = [gestureRecognizer translationInView:self.view];
                        view.center = CGPointMake(gestureRecognizer.view.center.x + translation.x, gestureRecognizer.view.center.y + translation.y);
                        [gestureRecognizer setTranslation:CGPointMake(00) 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的減速緩沖效果
                         
                         模擬減速寫的一個(gè)很簡單的方法。它遵循如下策略:
                         計(jì)算速度向量的長度(i.e. magnitude)
                         如果長度小于200,則減少基本速度,否則增加它。
                         基于速度和滑動因子計(jì)算終點(diǎn)
                         確定終點(diǎn)在視圖邊界內(nèi)
                         讓視圖使用動畫到達(dá)最終的靜止點(diǎn)
                         使用“Ease out“動畫參數(shù),使運(yùn)動速度隨著時(shí)間降低
                         
            */
                        
                        NSLog(@"======UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized");
                        
                        CGPoint velocity = [gestureRecognizer velocityInView:self.view];// 分別得出x,y軸方向的速度向量長度(velocity代表按照當(dāng)前速度,每秒可移動的像素個(gè)數(shù),分xy軸兩個(gè)方向)
                        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
                        
                        
            // 基于速度和滑動因子計(jì)算終點(diǎn)
                        CGPoint finalPoint = CGPointMake(view.center.x + (velocity.x * slideFactor),
                                                         view.center.y + (velocity.y * slideFactor));
                        
                        
            // 確定終點(diǎn)在視圖邊界內(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

            - (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]; // 這個(gè)view是手勢所屬的view,也就是增加手勢的那個(gè)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;
                    }
                }  
            }

            // 詢問一個(gè)手勢接收者是否應(yīng)該開始解釋執(zhí)行一個(gè)觸摸接收事件
            - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
            {
                CGPoint currentPoint = [gestureRecognizer locationInView:self.view];
                
            if (CGRectContainsPoint(CGRectMake(00100100), currentPoint) ) 
               {
                    
            return YES;
                }
                
                
            return NO;
            }

            // 詢問delegate,兩個(gè)手勢是否同時(shí)接收消息,返回YES同事接收。返回NO,不同是接收(如果另外一個(gè)手勢返回YES,則并不能保證不同時(shí)接收消息)the default implementation returns NO。
            // 這個(gè)函數(shù)一般在一個(gè)手勢接收者要阻止另外一個(gè)手勢接收自己的消息的時(shí)候調(diào)用
            - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
            {
                
            return NO;
            }

            // 詢問delegate是否允許手勢接收者接收一個(gè)touch對象
            // 返回YES,則允許對這個(gè)touch對象審核,NO,則不允許。
            // 這個(gè)方法在touchesBegan:withEvent:之前調(diào)用,為一個(gè)新的touch對象進(jìn)行調(diào)用
            - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
            {
                
            return YES;
            }

            本文轉(zhuǎn)自:http://blog.csdn.net/namehzf/article/details/7424882
            http://blog.csdn.net/longzs/article/details/7457108
            posted on 2014-07-29 13:35 王海光 閱讀(2013) 評論(0)  編輯 收藏 引用 所屬分類: IOS
            亚州日韩精品专区久久久| 99久久精品国产高清一区二区| 一本色道久久88加勒比—综合| 久久香蕉综合色一综合色88| 色成年激情久久综合| 久久精品无码av| 人人妻久久人人澡人人爽人人精品| 亚洲中文字幕久久精品无码喷水 | 久久婷婷五月综合色高清| 久久成人国产精品| 久久久久亚洲精品男人的天堂| 久久亚洲精品国产亚洲老地址| 99久久无色码中文字幕| 一本久久a久久精品综合香蕉| 久久99国产综合精品女同| 久久久久亚洲AV成人网人人网站| 久久精品国产2020| 99久久综合狠狠综合久久| 少妇精品久久久一区二区三区| 国产精品美女久久久久av爽| 浪潮AV色综合久久天堂| 中文字幕无码av激情不卡久久| 国产999精品久久久久久| 国内精品久久久久影院一蜜桃| 久久综合一区二区无码| 狠狠色综合网站久久久久久久| 久久国产精品99精品国产| 婷婷久久香蕉五月综合加勒比| 欧美激情精品久久久久久久九九九| 日本道色综合久久影院| 久久精品国产亚洲AV高清热| 亚洲女久久久噜噜噜熟女| 亚洲欧美一区二区三区久久| 久久国产香蕉一区精品| 精品久久久久久无码人妻蜜桃| 国产午夜精品理论片久久| 久久久国产精品福利免费| 色综合久久久久网| 久久99精品九九九久久婷婷| 国产午夜精品理论片久久 | 成人午夜精品久久久久久久小说 |