• <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>
            面對現實,超越自己
            逆水行舟,不進則退
            posts - 269,comments - 32,trackbacks - 0

            UIGestureRecognizer 是一個具體手勢的基類,提供了較為簡單的手勢實現方式  

            The concrete subclasses of UIGestureRecognizer are the following:

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

            一個gesture recognizer是不參與UIView的事件響應鏈的

            各個手勢使用時的代碼:

            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]; // 這個view是手勢所屬的view,也就是增加手勢的那個view
                
                switch (gestureRecognizer.state) {
                    case UIGestureRecognizerStateEnded:{ // UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // 正常情況下只響應這個消息
                        NSLog(@"======UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized");
                        break;
                    }
                    case UIGestureRecognizerStateFailed:{ // 
                        NSLog(@"======UIGestureRecognizerStateFailed");
                        break;
                    }
                    case UIGestureRecognizerStatePossible:{ // 
                        NSLog(@"======UIGestureRecognizerStatePossible");
                        break;
                    }
                    default:{
                        NSLog(@"======Unknow gestureRecognizer");
                        break;
                    }
                }  
            }

            // 詢問一個手勢接收者是否應該開始解釋執行一個觸摸接收事件
            - (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。
            // 這個函數一般在一個手勢接收者要阻止另外一個手勢接收自己的消息的時候調用
            - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
            {

                return NO;
            }

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


            其他引用:

            - (void)viewDidLoad
            {
                
            //單指單擊
                UITapGestureRecognizer *singleFingerOne = [[UITapGestureRecognizer alloc] initWithTarget:self 
            action:@selector(handleSingleFingerEvent:)];
                singleFingerOne.numberOfTouchesRequired = 1//手指數
                singleFingerOne.numberOfTapsRequired = 1;    //tap次數
                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;

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

                 這個一般情況下只響應
                 UIGestureRecognizerStateBegan、
                 UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized、
                 UIGestureRecognizerStateChanged消息,
                 一個UIGestureRecognizerStateBegan,接下去是N多的UIGestureRecognizerStateChanged,scale的值此時會不斷的變化,當手指離開時,響應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

            - (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屬性: 可以理解為兩手指之間的旋轉的角度,其實是個比例,相對角度,不是絕對角度
                 以剛開始的兩個手指對應的兩個point的之間的那條直線為標準,此時rotation=1.
                 向順時針旋轉,則rotation為正數且不斷變大,當旋轉360度時,rotation大概為6左右,如果繼續順時針旋轉,則角度會不斷增加,兩圈為12左右,此時若逆時針旋轉,角度則不斷變小
                 向逆時針旋轉,則rotation為負數且不斷變小,當旋轉360度時,rotation大概為-6左右
                 
                 velocity屬性: 可以理解為兩手指之間的移動速度,其實是個速度比例,相對速度,不是絕對速度
                 以剛開始的兩個手指對應的兩個point的之間的距離為標準,此時velocity=0.
                 若兩手指向順時針旋轉,則velocity為正數,從0開始,隨著手指向里捏合的速度越快,值越大,沒有上限
                 若兩手指向逆時針旋轉,則velocity為負數數,沒有上限,從-0開始,隨著手指向外捏合的速度越快,值越小,沒有上限
                 
            */
                CGFloat rotation = gestureRecognizer.rotation;
                NSLog(@"===rotation: %f", rotation);
                
                CGFloat velocity = gestureRecognizer.velocity;
                NSLog(@"======velocity: %f", velocity); 
                
                
            /*
                 旋轉手勢
                 
                 這個一般情況下只響應
                 UIGestureRecognizerStateBegan、
                 UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized、
                 UIGestureRecognizerStateChanged消息,
                 一個UIGestureRecognizerStateBegan,接下去是N多的UIGestureRecognizerStateChanged,scale的值此時會不斷的變化,當手指離開時,響應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// 重置 這個相當重要!!! 
                        
                        
            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.
                
                
            /*
                 同一個手勢只能指定一個方向,不能同時指定多個方向,要指定多個方向 必須用多個手勢
                 
            */
                
                
            // 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;// 手指個數 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;// 手指個數 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;// 手指個數 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;// 手指個數 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;
                }
                
                
            /*
                 輕掃手勢
                 
                 這個一般情況下只響應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]; // 這個view是手勢所屬的view,也就是增加手勢的那個view 
                
                
            switch (gestureRecognizer.state) {
                    
            case UIGestureRecognizerStateBegan:{ 
                        NSLog(@"======UIGestureRecognizerStateBegan");
                        
            break;
                    }
                    
            case UIGestureRecognizerStateChanged:{ 
                        NSLog(@"======UIGestureRecognizerStateChanged");
                        
                        
            /*
                         讓view跟著手指移動
                         
                         1.獲取每次系統捕獲到的手指移動的偏移量translation
                         2.根據偏移量translation算出當前view應該出現的位置
                         3.設置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(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
                        
                        
            /*
                         當手勢結束后,view的減速緩沖效果
                         
                         模擬減速寫的一個很簡單的方法。它遵循如下策略:
                         計算速度向量的長度(i.e. magnitude)
                         如果長度小于200,則減少基本速度,否則增加它。
                         基于速度和滑動因子計算終點
                         確定終點在視圖邊界內
                         讓視圖使用動畫到達最終的靜止點
                         使用“Ease out“動畫參數,使運動速度隨著時間降低
                         
            */
                        
                        NSLog(@"======UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized");
                        
                        CGPoint velocity = [gestureRecognizer velocityInView:self.view];// 分別得出x,y軸方向的速度向量長度(velocity代表按照當前速度,每秒可移動的像素個數,分xy軸兩個方向)
                        CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y));// 根據直角三角形的算法算出綜合速度向量長度
                        
                        
            // 如果長度小于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));
                        
                        
            // 確定終點在視圖邊界內
                        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]; // 這個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;
                    }
                }  
            }

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

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

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

            本文轉自: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
            高清免费久久午夜精品| 人妻无码久久精品| 国产精品欧美久久久久无广告| 久久久久久国产精品美女 | 国产精品久久久久aaaa| 久久国产综合精品五月天| 日韩久久久久久中文人妻| 国产综合免费精品久久久| 一本色道久久综合狠狠躁| 国产—久久香蕉国产线看观看| 久久人人爽人人人人片av| 99久久99久久精品国产| 亚洲AV日韩精品久久久久久久| 国产福利电影一区二区三区久久久久成人精品综合| 日本精品久久久久影院日本| 97久久精品无码一区二区天美| 亚洲中文字幕伊人久久无码| 99久久免费只有精品国产| 久久久亚洲欧洲日产国码二区| 国内精品久久久久影院亚洲| 国产免费福利体检区久久| 国产Av激情久久无码天堂| 精品熟女少妇AV免费久久 | 久久久久久久人妻无码中文字幕爆| 国产毛片久久久久久国产毛片| 久久99国产精品一区二区| 久久久久99精品成人片试看| 国产aⅴ激情无码久久| 久久国产欧美日韩精品免费| 久久亚洲高清综合| 国产精品欧美久久久久天天影视 | 久久精品国产亚洲AV麻豆网站 | 久久精品人人做人人爽电影蜜月| 2021最新久久久视精品爱| 亚洲国产日韩欧美久久| 精品国产一区二区三区久久蜜臀| 久久国产精品-国产精品| 久久精品国产精品国产精品污| 久久不见久久见免费视频7| 久久精品人人做人人爽97| 精品蜜臀久久久久99网站|