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

面對現(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>
            国产精品亚洲成人| 国产女人水真多18毛片18精品视频| 久久精品夜夜夜夜久久| 亚洲六月丁香色婷婷综合久久| 久久精品视频免费观看| 国产精品99久久久久久有的能看| 欧美黄色大片网站| 亚洲精品之草原avav久久| 欧美a级大片| 久久野战av| 亚洲国产成人91精品| 美女视频黄 久久| 久久视频一区| 亚洲国产精品嫩草影院| 欧美激情精品久久久久| 欧美高清免费| 亚洲午夜91| 亚洲免费视频一区二区| 国内一区二区在线视频观看| 麻豆亚洲精品| 欧美国产激情| 亚洲欧美日产图| 欧美一级网站| 亚洲国产影院| 亚洲免费黄色| 国产老女人精品毛片久久| 久久精品一区| 欧美成人精品不卡视频在线观看| 一本色道久久综合亚洲精品高清 | 欧美成人免费va影院高清| 91久久精品久久国产性色也91| 亚洲国产精品一区二区三区| 欧美大片网址| 亚洲综合激情| 久久频这里精品99香蕉| a4yy欧美一区二区三区| 亚洲欧美日韩在线播放| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产一区二区三区奇米久涩 | 性色av一区二区三区| 久久久国产亚洲精品| 日韩亚洲在线| 亚洲欧美国产毛片在线| 亚洲国内在线| 亚洲自拍偷拍麻豆| 亚洲高清在线精品| 在线视频你懂得一区| 一区在线免费观看| 一本综合久久| 亚洲福利视频一区| 亚洲一区二区视频在线观看| 亚洲福利视频在线| 亚洲欧美日韩在线播放| 亚洲日本在线观看| 欧美综合国产| 亚洲国产另类久久精品| 久久久中精品2020中文| 一区二区三区免费看| 欧美永久精品| 亚洲网站在线看| 久久亚洲国产精品一区二区| 亚洲免费一在线| 欧美福利电影网| 久久中文在线| 国产日韩精品一区二区| 99精品福利视频| 最近看过的日韩成人| 久久爱www.| 欧美在线视频日韩| 国产精品jvid在线观看蜜臀| 亚洲国产精品一区二区三区| 亚洲电影免费观看高清完整版在线| 亚洲一区999| 亚洲一区二区精品视频| 欧美精品在线观看一区二区| 欧美成人午夜激情在线| 国产一区二区三区久久| 午夜激情亚洲| 欧美一区不卡| 国产精品久久久久久五月尺| aa级大片欧美| 一区二区三区四区国产| 欧美黑人多人双交| 亚洲国产美女| 99精品国产在热久久| 欧美人成免费网站| 亚洲精品中文字幕在线| 亚洲三级国产| 欧美aaa级| 亚洲缚视频在线观看| 亚洲日本乱码在线观看| 美女主播一区| 亚洲国产毛片完整版 | 亚洲天堂av在线免费| 欧美日韩精品一区二区三区| 亚洲区在线播放| 一区二区三区 在线观看视频| 欧美国产日韩xxxxx| 亚洲精品社区| 亚洲一区图片| 国产精品一区二区在线观看| 午夜亚洲精品| 老司机67194精品线观看| 亚洲国产精品久久人人爱蜜臀| 美女诱惑黄网站一区| 亚洲精品之草原avav久久| 亚洲欧美日韩一区二区三区在线观看 | 亚洲二区在线观看| 欧美大片一区二区| 一区二区三区www| 久久爱www.| 亚洲高清资源综合久久精品| 欧美精品情趣视频| 亚洲一区视频| 蜜桃久久av一区| 久久久国产亚洲精品| 欧美国产成人精品| 夜夜嗨一区二区| 午夜欧美精品| 韩日视频一区| 欧美成人精品在线播放| 99成人精品| 久久精品99国产精品日本| 影音先锋成人资源站| 欧美激情一区二区三区| 亚洲线精品一区二区三区八戒| 久久综合色婷婷| 一区二区三区日韩在线观看| 国产美女精品视频免费观看| 久久综合一区| 亚洲一区二区三区色| 欧美暴力喷水在线| 亚洲在线日韩| 亚洲第一福利视频| 欧美日韩综合久久| 久久免费视频在线观看| 一区二区欧美国产| 久热国产精品| 亚洲欧美网站| 亚洲国产高潮在线观看| 欧美色精品天天在线观看视频| 欧美综合国产精品久久丁香| 亚洲三级电影全部在线观看高清| 久久久999| 亚洲视频精选| 亚洲国产成人在线播放| 国产日韩欧美a| 欧美日韩在线视频观看| 免费中文日韩| 久久精品亚洲精品| 亚洲欧美日韩精品久久久久| 亚洲人永久免费| 欧美福利一区二区| 久久婷婷一区| 久久国产精品72免费观看| 国产精品99久久久久久久女警| 亚洲成在线观看| 激情懂色av一区av二区av| 国产精品一区二区久久久| 欧美激情第二页| 蜜乳av另类精品一区二区| 久久久久久夜精品精品免费| 亚洲欧美成aⅴ人在线观看| 9色精品在线| 亚洲美女啪啪| 亚洲精品久久久久久久久久久| 欧美国产第一页| 开心色5月久久精品| 久久视频在线视频| 久久久久久网站| 久久久久国产精品人| 久久精品盗摄| 久久九九热re6这里有精品| 久久精品国产99国产精品澳门| 性欧美精品高清| 欧美主播一区二区三区美女 久久精品人| 亚洲神马久久| 亚洲欧美变态国产另类| 亚洲女人小视频在线观看| 午夜精品福利在线观看| 欧美在线观看一区| 欧美一二三视频| 久久精品国产久精国产思思| 久久久亚洲精品一区二区三区| 久久久久久亚洲综合影院红桃| 美脚丝袜一区二区三区在线观看 | 亚洲人成啪啪网站| 久久久免费精品视频| 欧美.www| 欧美激情一区二区三区全黄| 欧美区二区三区| 欧美视频一区在线| 国产精品日韩精品欧美在线 | 亚洲永久字幕| 久久成人免费| 女同性一区二区三区人了人一| 亚洲国产精品www| 一本色道久久加勒比精品| 亚洲欧美区自拍先锋| 久久久久久亚洲精品杨幂换脸|