青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

面對現(xiàn)實,超越自己
逆水行舟,不進則退
posts - 269,comments - 32,trackbacks - 0

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

The concrete subclasses of UIGestureRecognizer are the following:

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

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

各個手勢使用時的代碼:

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 // 正常情況下只響應(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對象進行調(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)單指雙擊時,會先調(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]; // 這個view是手勢所屬的view,也就是增加手勢的那個view 
   
    
/*
     scale屬性: 可以理解為兩手指之間的距離,其實是個比例,相對距離,不是絕對距離
                以剛開始的兩個手指對應(yīng)的兩個point的之間的距離為標準,此時scale=1.
                若兩手指之間距離減小,則scale不斷變小,當(dāng)兩指重合,則變?yōu)?
                若兩手指之間距離變大,則scale不斷增大,沒有上限,看屏幕多大
     
     velocity屬性: 可以理解為兩手指之間的移動速度,其實是個速度比例,相對速度,不是絕對速度
                以剛開始的兩個手指對應(yīng)的兩個point的之間的距離為標準,此時velocity=0.
                若兩手指之間距離減小,則velocity為負數(shù),從-0開始,隨著手指向里捏合的速度越快,負值越大,沒有上限,我測試了下,可以到-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ù)在機器中的表示按照IEEE的標準是這樣的:
     +------+----------------+-------------------------------+   
     | 1bit    |   8bit               |         23bit                            |   
     +------+----------------+-------------------------------+
     其中:1bit表示符號位(0表示正,1表示負),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進制看到的就是[80xxxxxx]h或者[00xxxxxx]h
     3. 無窮值:如果指數(shù)全部為1,尾數(shù)全部為0,則根據(jù)符號位分別表示正無窮大和負無窮大,16進制看到的就是[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一般被用于標記未初始化的值,以此來捕獲異常。
     那么既然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

- (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的之間的那條直線為標準,此時rotation=1.
     向順時針旋轉(zhuǎn),則rotation為正數(shù)且不斷變大,當(dāng)旋轉(zhuǎn)360度時,rotation大概為6左右,如果繼續(xù)順時針旋轉(zhuǎn),則角度會不斷增加,兩圈為12左右,此時若逆時針旋轉(zhuǎn),角度則不斷變小
     向逆時針旋轉(zhuǎn),則rotation為負數(shù)且不斷變小,當(dāng)旋轉(zhuǎn)360度時,rotation大概為-6左右
     
     velocity屬性: 可以理解為兩手指之間的移動速度,其實是個速度比例,相對速度,不是絕對速度
     以剛開始的兩個手指對應(yīng)的兩個point的之間的距離為標準,此時velocity=0.
     若兩手指向順時針旋轉(zhuǎn),則velocity為正數(shù),從0開始,隨著手指向里捏合的速度越快,值越大,沒有上限
     若兩手指向逆時針旋轉(zhuǎn),則velocity為負數(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

- (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

- (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.獲取每次系統(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的減速緩沖效果
             
             模擬減速寫的一個很簡單的方法。它遵循如下策略:
             計算速度向量的長度(i.e. magnitude)
             如果長度小于200,則減少基本速度,否則增加它。
             基于速度和滑動因子計算終點
             確定終點在視圖邊界內(nèi)
             讓視圖使用動畫到達最終的靜止點
             使用“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

- (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(00100100), 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對象進行調(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 王海光 閱讀(2040) 評論(0)  編輯 收藏 引用 所屬分類: IOS
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美三级黄美女| 欧美成人中文字幕| 激情校园亚洲| 黄色成人av网| 亚洲激情亚洲| 亚洲人成亚洲人成在线观看图片| 一区精品在线| 亚洲伦理久久| 午夜免费久久久久| 久久中文字幕导航| 亚洲电影免费| 亚洲理论在线观看| 亚洲一区二区精品在线| 欧美一区二区国产| 欧美激情综合五月色丁香| 亚洲欧美日韩直播| 欧美亚洲综合另类| 久久久久久夜精品精品免费| 欧美日产在线观看| 国产有码一区二区| 99re热这里只有精品免费视频| 午夜在线一区| 亚洲国产视频一区二区| 亚洲一区二区三区高清不卡| 久久午夜电影网| 国产精品女主播在线观看 | 国产精品久久国产精麻豆99网站| 国产精品色在线| 亚洲激情在线观看| 久久精品五月| 亚洲图片欧美日产| 欧美精品免费在线| 精品动漫3d一区二区三区| 亚洲社区在线观看| 欧美成人日韩| 久久国产精品色婷婷| 欧美深夜福利| 日韩一级黄色片| 欧美va天堂在线| 午夜一级在线看亚洲| 欧美日韩三区四区| 亚洲美女精品成人在线视频| 裸体一区二区三区| 欧美在线91| 国产精品资源| 香蕉成人啪国产精品视频综合网| 亚洲精品一二三区| 欧美激情综合五月色丁香小说| 狠狠色狠狠色综合人人| 香蕉久久夜色精品国产使用方法| 亚洲精品国精品久久99热一| 老牛嫩草一区二区三区日本| 国产日韩在线看| 午夜伦欧美伦电影理论片| 夜夜嗨av一区二区三区四季av | 欧美午夜精品理论片a级大开眼界| 亚洲福利国产精品| 久久这里只精品最新地址| 亚洲综合视频一区| 国产老女人精品毛片久久| 亚洲女同精品视频| 亚洲天堂激情| 国产精品在线看| 久久精品欧美日韩| 久久精品国产在热久久 | 亚洲欧美在线播放| 亚洲综合视频1区| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 亚洲电影av| 男人的天堂成人在线| 亚洲成色777777在线观看影院| 久久久精品久久久久| 久久久精品tv| 亚洲精品美女在线观看播放| 91久久夜色精品国产九色| 欧美乱在线观看| 午夜精品久久久久久久久| 亚洲欧美精品| 伊人久久亚洲美女图片| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美日韩视频一区二区| 亚洲视频一区二区在线观看 | 欧美在线观看视频在线| 欧美一级大片在线观看| 一区二区三区在线免费视频| 亚洲成色精品| 国产精品久久久久久久9999| 欧美一区二区在线看| 久久久久在线观看| 在线午夜精品| 久久国内精品视频| 99国产麻豆精品| 欧美一区二区三区四区视频| 亚洲人成人77777线观看| 一区二区免费在线播放| 国产一区三区三区| 亚洲免费成人av电影| 国产一区二区三区不卡在线观看| 欧美激情一区二区三区全黄| 国产精品大片wwwwww| 美女视频黄 久久| 国产精品高潮在线| 亚洲第一黄网| 国模精品一区二区三区色天香| 亚洲人成亚洲人成在线观看图片| 国产欧美精品日韩| 亚洲片在线观看| 极品少妇一区二区三区精品视频| 日韩一区二区精品葵司在线| 一区二区在线视频播放| 亚洲无亚洲人成网站77777 | 一区二区日韩| 久久久久久夜精品精品免费| 亚洲一区在线观看视频 | 亚洲一级特黄| 欧美高清视频| 久久免费视频在线观看| 国产综合久久久久久鬼色| 亚洲国产欧美不卡在线观看| 国产亚洲a∨片在线观看| 日韩午夜精品视频| 最新日韩av| 久久亚洲二区| 久久久免费av| 国产亚洲欧洲997久久综合| 亚洲视频精选| 亚洲一区久久久| 欧美日韩一区二区在线观看| 亚洲大片免费看| 亚洲国产mv| 另类人畜视频在线| 欧美不卡视频一区| 亚洲高清自拍| 猛男gaygay欧美视频| 麻豆国产精品va在线观看不卡| 国产一区二区高清| 欧美在线高清视频| 久久一区二区三区国产精品| 国产真实乱子伦精品视频| 欧美一区二区三区日韩视频| 久久黄色小说| 一区二区三区在线高清| 久久综合中文色婷婷| 欧美大成色www永久网站婷| 亚洲高清视频一区| 欧美不卡一卡二卡免费版| 亚洲电影在线观看| 亚洲视频导航| 国产日本欧洲亚洲| 久久久精品一区| 亚洲国产精品久久久久婷婷884| 日韩视频第一页| 国产精品久99| 久久久噜噜噜久久中文字幕色伊伊| 欧美高清不卡在线| 中文av一区二区| 国产亚洲制服色| 欧美激情精品久久久| 一区二区三区鲁丝不卡| 欧美中日韩免费视频| 亚洲国产精品999| 欧美视频中文一区二区三区在线观看| 亚洲一本大道在线| 乱中年女人伦av一区二区| 99国产精品99久久久久久| 国产精品一区一区三区| 开心色5月久久精品| 一本色道综合亚洲| 欧美福利在线| 午夜在线精品| 亚洲毛片一区| 国内一区二区在线视频观看 | 精品成人国产| 欧美日韩中国免费专区在线看| 亚洲综合视频在线| 亚洲日本中文| 久久躁狠狠躁夜夜爽| 亚洲专区在线| 亚洲欧洲中文日韩久久av乱码| 国产精品日韩欧美综合| 欧美va天堂va视频va在线| 亚洲欧美日韩一区二区三区在线观看| 欧美激情视频一区二区三区在线播放| 欧美在线网站| 亚洲综合另类| 一个色综合av| 91久久精品日日躁夜夜躁欧美| 国产视频丨精品|在线观看| 香港久久久电影| 99国产精品| 在线欧美影院| 国产主播一区| 国产精品一区二区三区免费观看| 欧美gay视频| 久久伊人免费视频| 香蕉久久夜色精品国产| 这里只有精品视频| 亚洲精品男同| 亚洲精品日韩久久| 亚洲国产欧美一区二区三区丁香婷 |