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

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

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

The concrete subclasses of UIGestureRecognizer are the following:

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

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

各個(gè)手勢(shì)使用時(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是手勢(shì)所屬的view,也就是增加手勢(shì)的那個(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;
        }
    }  
}

// 詢問(wèn)一個(gè)手勢(shì)接收者是否應(yīng)該開(kāi)始解釋執(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;
}

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

    return NO;
}

// 詢問(wèn)delegate是否允許手勢(shì)接收者接收一個(gè)touch對(duì)象
// 返回YES,則允許對(duì)這個(gè)touch對(duì)象審核,NO,則不允許。
// 這個(gè)方法在touchesBegan:withEvent:之前調(diào)用,為一個(gè)新的touch對(duì)象進(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í),會(huì)先調(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是手勢(shì)所屬的view,也就是增加手勢(shì)的那個(gè)view 
   
    
/*
     scale屬性: 可以理解為兩手指之間的距離,其實(shí)是個(gè)比例,相對(duì)距離,不是絕對(duì)距離
                以剛開(kāi)始的兩個(gè)手指對(duì)應(yīng)的兩個(gè)point的之間的距離為標(biāo)準(zhǔn),此時(shí)scale=1.
                若兩手指之間距離減小,則scale不斷變小,當(dāng)兩指重合,則變?yōu)?
                若兩手指之間距離變大,則scale不斷增大,沒(méi)有上限,看屏幕多大
     
     velocity屬性: 可以理解為兩手指之間的移動(dòng)速度,其實(shí)是個(gè)速度比例,相對(duì)速度,不是絕對(duì)速度
                以剛開(kāi)始的兩個(gè)手指對(duì)應(yīng)的兩個(gè)point的之間的距離為標(biāo)準(zhǔn),此時(shí)velocity=0.
                若兩手指之間距離減小,則velocity為負(fù)數(shù),從-0開(kāi)始,隨著手指向里捏合的速度越快,負(fù)值越大,沒(méi)有上限,我測(cè)試了下,可以到-20.009099,甚至更大
                若兩手指之間距離變大,則velocity不斷正數(shù),沒(méi)有上限,從0開(kāi)始,隨著手指向外捏合的速度越快,值越大,沒(méi)有上限,我測(cè)試了下,可以到170.234663,甚至更大
                注意:在這個(gè)過(guò)程中,出現(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表示符號(hào)位(0表示正,1表示負(fù)),8bit表示指數(shù)(0~255,實(shí)際指數(shù)取值還要減去127,即指數(shù)取值區(qū)間為-127~128),23bit表示尾數(shù)。
     這里所要說(shuō)的浮點(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. 無(wú)窮值:如果指數(shù)全部為1,尾數(shù)全部為0,則根據(jù)符號(hào)位分別表示正無(wú)窮大和負(fù)無(wú)窮大,16進(jìn)制看到的就是[FF800000]h或者[7F800000]h
     4. NAN:主角來(lái)了,如果指數(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é)果,最常見(jiàn)的莫過(guò)于除0運(yùn)算;SNAN一般被用于標(biāo)記未初始化的值,以此來(lái)捕獲異常。
     那么既然NAN不是一個(gè)真實(shí)的數(shù)值,在程序如何判斷變量是否變成了NAN呢?大部分語(yǔ)言中針對(duì)NAN值都有一系列的函數(shù)定義,C語(yǔ)言中最常見(jiàn)的三個(gè)函數(shù):
     _isnan(double x);                  //判斷是否為NAN
     _finite(double x);                  //判讀是否為無(wú)窮大
     _fpclass(double x);                //返回一系列的定義值,如:_FPCLASS_QNAN, _FPCLASS_SNAN,具體參考MSDN

     
*/
    CGFloat scale = gestureRecognizer.scale;
    NSLog(@"======scale: %f", scale);
    
    CGFloat velocity = gestureRecognizer.velocity;
    NSLog(@"======scvelocityale: %f", velocity);
    
    
/*
     捏合手勢(shì)

     這個(gè)一般情況下只響應(yīng)
     UIGestureRecognizerStateBegan、
     UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized、
     UIGestureRecognizerStateChanged消息,
     一個(gè)UIGestureRecognizerStateBegan,接下去是N多的UIGestureRecognizerStateChanged,scale的值此時(shí)會(huì)不斷的變化,當(dāng)手指離開(kāi)時(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// 重置,很重要!!!
            
            
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是手勢(shì)所屬的view,也就是增加手勢(shì)的那個(gè)view
    
    
/*
     rotation屬性: 可以理解為兩手指之間的旋轉(zhuǎn)的角度,其實(shí)是個(gè)比例,相對(duì)角度,不是絕對(duì)角度
     以剛開(kāi)始的兩個(gè)手指對(duì)應(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),則角度會(huì)不斷增加,兩圈為12左右,此時(shí)若逆時(shí)針旋轉(zhuǎn),角度則不斷變小
     向逆時(shí)針旋轉(zhuǎn),則rotation為負(fù)數(shù)且不斷變小,當(dāng)旋轉(zhuǎn)360度時(shí),rotation大概為-6左右
     
     velocity屬性: 可以理解為兩手指之間的移動(dòng)速度,其實(shí)是個(gè)速度比例,相對(duì)速度,不是絕對(duì)速度
     以剛開(kāi)始的兩個(gè)手指對(duì)應(yīng)的兩個(gè)point的之間的距離為標(biāo)準(zhǔn),此時(shí)velocity=0.
     若兩手指向順時(shí)針旋轉(zhuǎn),則velocity為正數(shù),從0開(kāi)始,隨著手指向里捏合的速度越快,值越大,沒(méi)有上限
     若兩手指向逆時(shí)針旋轉(zhuǎn),則velocity為負(fù)數(shù)數(shù),沒(méi)有上限,從-0開(kāi)始,隨著手指向外捏合的速度越快,值越小,沒(méi)有上限
     
*/
    CGFloat rotation = gestureRecognizer.rotation;
    NSLog(@"===rotation: %f", rotation);
    
    CGFloat velocity = gestureRecognizer.velocity;
    NSLog(@"======velocity: %f", velocity); 
    
    
/*
     旋轉(zhuǎn)手勢(shì)
     
     這個(gè)一般情況下只響應(yīng)
     UIGestureRecognizerStateBegan、
     UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized、
     UIGestureRecognizerStateChanged消息,
     一個(gè)UIGestureRecognizerStateBegan,接下去是N多的UIGestureRecognizerStateChanged,scale的值此時(shí)會(huì)不斷的變化,當(dāng)手指離開(kāi)時(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è)手勢(shì)只能指定一個(gè)方向,不能同時(shí)指定多個(gè)方向,要指定多個(gè)方向 必須用多個(gè)手勢(shì)
     
*/
    
    
// 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;// 手指?jìng)€(gè)數(shù) The default value is 1.
        swipeGestureRight.direction = UISwipeGestureRecognizerDirectionRight;// 同一個(gè)手勢(shì)只能指定一個(gè)方向,不能同時(shí)指定多個(gè)方向,要指定多個(gè)方向 必須用多個(gè)手勢(shì)
        [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;// 手指?jìng)€(gè)數(shù) The default value is 1.
        swipeGestureLeft.direction = UISwipeGestureRecognizerDirectionLeft;// 同一個(gè)手勢(shì)只能指定一個(gè)方向,不能同時(shí)指定多個(gè)方向,要指定多個(gè)方向 必須用多個(gè)手勢(shì)
        [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;// 手指?jìng)€(gè)數(shù) The default value is 1.
        swipeGestureUp.direction = UISwipeGestureRecognizerDirectionUp;// 同一個(gè)手勢(shì)只能指定一個(gè)方向,不能同時(shí)指定多個(gè)方向,要指定多個(gè)方向 必須用多個(gè)手勢(shì)
        [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;// 手指?jìng)€(gè)數(shù) The default value is 1.
        swipeGestureDown.direction = UISwipeGestureRecognizerDirectionDown;// 同一個(gè)手勢(shì)只能指定一個(gè)方向,不能同時(shí)指定多個(gè)方向,要指定多個(gè)方向 必須用多個(gè)手勢(shì)
        [self.view addGestureRecognizer:swipeGestureDown];
    }
}

- (void)handleGesture:(UISwipeGestureRecognizer *)gestureRecognizer
{
    UIView *view = [gestureRecognizer view]; // 這個(gè)view是手勢(shì)所屬的view,也就是增加手勢(shì)的那個(gè)view
    
    
/*
     direction屬性: 用來(lái)指明手勢(shì)滑動(dòng)的方向的。
     
*/
    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;
    }
    
    
/*
     輕掃手勢(shì)
     
     這個(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];
    }
}

// 拖拽手勢(shì)
- (void)handleGesture:(UIPanGestureRecognizer *)gestureRecognizer
{
    UIView *view = [gestureRecognizer view]; // 這個(gè)view是手勢(shì)所屬的view,也就是增加手勢(shì)的那個(gè)view 
    
    
switch (gestureRecognizer.state) {
        
case UIGestureRecognizerStateBegan:{ 
            NSLog(@"======UIGestureRecognizerStateBegan");
            
break;
        }
        
case UIGestureRecognizerStateChanged:{ 
            NSLog(@"======UIGestureRecognizerStateChanged");
            
            
/*
             讓view跟著手指移動(dòng)
             
             1.獲取每次系統(tǒng)捕獲到的手指移動(dòng)的偏移量translation
             2.根據(jù)偏移量translation算出當(dāng)前view應(yīng)該出現(xiàn)的位置
             3.設(shè)置view的新frame
             4.將translation重置為0(十分重要。否則translation每次都會(huì)疊加,很快你的view就會(huì)移除屏幕!)
             
*/
            
            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];//  注意一旦你完成上述的移動(dòng),將translation重置為0十分重要。否則translation每次都會(huì)疊加,很快你的view就會(huì)移除屏幕!
            break;
        }
        
case UIGestureRecognizerStateCancelled:{ 
            NSLog(@"======UIGestureRecognizerStateCancelled");
            
break;
        }
        
case UIGestureRecognizerStateFailed:{ 
            NSLog(@"======UIGestureRecognizerStateFailed");
            
break;
        }
        
case UIGestureRecognizerStatePossible:{ 
            NSLog(@"======UIGestureRecognizerStatePossible");
            
break;
        }
        
case UIGestureRecognizerStateEnded:{ // UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded
            
            
/*
             當(dāng)手勢(shì)結(jié)束后,view的減速緩沖效果
             
             模擬減速寫的一個(gè)很簡(jiǎn)單的方法。它遵循如下策略:
             計(jì)算速度向量的長(zhǎng)度(i.e. magnitude)
             如果長(zhǎng)度小于200,則減少基本速度,否則增加它。
             基于速度和滑動(dòng)因子計(jì)算終點(diǎn)
             確定終點(diǎn)在視圖邊界內(nèi)
             讓視圖使用動(dòng)畫到達(dá)最終的靜止點(diǎn)
             使用“Ease out“動(dòng)畫參數(shù),使運(yùn)動(dòng)速度隨著時(shí)間降低
             
*/
            
            NSLog(@"======UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized");
            
            CGPoint velocity = [gestureRecognizer velocityInView:self.view];// 分別得出x,y軸方向的速度向量長(zhǎng)度(velocity代表按照當(dāng)前速度,每秒可移動(dòng)的像素個(gè)數(shù),分xy軸兩個(gè)方向)
            CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y));// 根據(jù)直角三角形的算法算出綜合速度向量長(zhǎng)度
            
            
// 如果長(zhǎng)度小于200,則減少基本速度,否則增加它。
            CGFloat slideMult = magnitude / 200;
            
            NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult);
            
float slideFactor = 0.1 * slideMult; // Increase for more of a slide
            
            
// 基于速度和滑動(dòng)因子計(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是手勢(shì)所屬的view,也就是增加手勢(shì)的那個(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;
        }
    }  
}

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

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

// 詢問(wèn)delegate是否允許手勢(shì)接收者接收一個(gè)touch對(duì)象
// 返回YES,則允許對(duì)這個(gè)touch對(duì)象審核,NO,則不允許。
// 這個(gè)方法在touchesBegan:withEvent:之前調(diào)用,為一個(gè)新的touch對(duì)象進(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 王海光 閱讀(2040) 評(píng)論(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>
            亚洲国产视频a| 亚洲高清在线观看一区| 国产精品成人v| 在线观看精品| 久久精品国产久精国产思思| 亚洲少妇在线| 欧美日韩精品欧美日韩精品| 91久久久精品| 欧美成人a∨高清免费观看| 欧美综合第一页| 国产午夜亚洲精品羞羞网站| 午夜精品短视频| 亚洲免费在线视频| 老司机一区二区| 亚洲成人在线视频播放| 性欧美videos另类喷潮| 欧美三级网址| 一区二区三区回区在观看免费视频| 欧美大片在线观看一区| 久久久久久久激情视频| ●精品国产综合乱码久久久久| 久久亚洲影院| 久久久久综合| 99re亚洲国产精品| 亚洲精品午夜精品| 国产精品国产三级国产普通话蜜臀| 一区二区三区欧美成人| 日韩一区二区免费看| 欧美系列亚洲系列| 亚洲宅男天堂在线观看无病毒| 中国成人在线视频| 国产精品一区2区| 欧美呦呦网站| 美脚丝袜一区二区三区在线观看| 亚洲国产精品女人久久久| 亚洲精品精选| 欧美日韩中文字幕精品| 午夜亚洲精品| 久久蜜桃资源一区二区老牛 | 免费成人黄色| 一本色道久久综合亚洲精品高清| 99精品久久久| 国产一区二区久久| 亚洲黄色成人| 国产精品草莓在线免费观看| 久久国产精品毛片| 久久影院午夜论| 一区二区高清视频| 亚洲一区二区三区免费在线观看| 国产曰批免费观看久久久| 欧美超级免费视 在线| 欧美日韩午夜| 欧美xart系列高清| 国产精品你懂得| 亚洲第一级黄色片| 麻豆精品国产91久久久久久| 欧美mv日韩mv国产网站| 亚洲欧美在线看| 欧美成人在线免费视频| 欧美一区二区在线播放| 欧美激情中文不卡| 男女激情久久| 国产九九精品视频| 亚洲精品久久久久久一区二区| 国产午夜精品美女视频明星a级| 亚洲高清在线| 激情自拍一区| 欧美一级精品大片| 亚洲午夜激情网页| 欧美大片第1页| 老司机午夜免费精品视频| 国产精品一区久久| 亚洲精品一区二区网址| 欧美一区国产一区| 久久av一区二区| 亚洲一区免费看| 久久亚洲私人国产精品va媚药| 香蕉成人伊视频在线观看| 欧美日韩一区二区三区在线视频| 免费在线看一区| 国内成+人亚洲+欧美+综合在线| 亚洲深爱激情| 亚洲视频免费| 欧美日韩国产小视频| 亚洲激情影院| 在线免费日韩片| 香港久久久电影| 欧美一区=区| 国产精品美女一区二区| 一本色道久久综合狠狠躁篇的优点 | 久久一日本道色综合久久| 久久大香伊蕉在人线观看热2| 欧美伦理91| 亚洲国产美女| 在线视频欧美日韩精品| 欧美激情在线观看| 亚洲欧洲日韩综合二区| 亚洲美女啪啪| 欧美精品一区二区三区一线天视频| 欧美激情性爽国产精品17p| 尤妮丝一区二区裸体视频| 久久激情视频| 欧美激情视频网站| 99精品福利视频| 国产精品免费视频观看| 欧美亚洲免费电影| 免费成人黄色片| 亚洲人人精品| 欧美男人的天堂| 亚洲午夜久久久久久久久电影网| 亚洲欧美日韩中文播放| 国产一区999| 欧美成人高清视频| 99精品欧美一区二区三区综合在线| 午夜在线视频观看日韩17c| 国产亚洲欧美一区在线观看| 久久久久久亚洲综合影院红桃| 亚洲黄一区二区三区| 亚洲一区二区精品在线| 国产欧美一区二区三区久久| 久久久91精品| 亚洲国产第一页| 亚洲一区二区三区免费在线观看| 国产亚洲高清视频| 欧美高清视频在线播放| 久久黄色影院| 亚洲韩国青草视频| 欧美性jizz18性欧美| 久久国产福利| 99热在线精品观看| 久热成人在线视频| 亚洲欧美日韩视频二区| 在线观看亚洲精品| 欧美视频中文字幕在线| 久久手机免费观看| 宅男精品视频| 欧美不卡一卡二卡免费版| 中文成人激情娱乐网| 久久人人爽国产| 亚洲一区二区精品| 亚洲电影视频在线| 国产精品av久久久久久麻豆网| 亚洲在线视频网站| 欧美精品自拍偷拍动漫精品| 午夜精品在线观看| 91久久久国产精品| 久久久美女艺术照精彩视频福利播放 | 久久久久88色偷偷免费| 亚洲美女免费视频| 国模大胆一区二区三区| 欧美日韩精品| 狼人天天伊人久久| 欧美一级淫片aaaaaaa视频| 最新亚洲视频| 欧美韩日亚洲| 久久影院午夜论| 午夜在线观看欧美| 亚洲一区二区精品| 99re66热这里只有精品4| 国产精品电影观看| 欧美日韩视频| 欧美激情中文字幕一区二区| 久久九九99视频| 欧美一区二区在线观看| 亚洲一二三区在线| 中文精品99久久国产香蕉| 亚洲破处大片| 欧美成人精精品一区二区频| 久久天天躁狠狠躁夜夜av| 午夜精品一区二区在线观看 | 这里只有精品电影| 99re热精品| 亚洲久久视频| 99国产精品视频免费观看| 亚洲电影在线看| 欧美国产丝袜视频| 欧美电影免费观看高清| 久久视频在线看| 免费在线日韩av| 欧美大片91| 亚洲电影观看| 91久久久在线| 亚洲免费av片| 亚洲免费网站| 欧美在线视频一区二区三区| 久久国产精品久久国产精品| 久久九九精品99国产精品| 久久只精品国产| 欧美激情亚洲国产| 欧美视频在线观看视频极品| 国产精品大片wwwwww| 国产九色精品成人porny| 国产一区二区黄色| 精品va天堂亚洲国产| 91久久精品国产91性色tv| 99re66热这里只有精品4| 午夜欧美精品| 麻豆av福利av久久av| 欧美激情第六页| 一本大道久久a久久精二百|