2012-12-14 109 views
10

我試圖建立一個GestureRecognizer拖動一個UIView從右到左。如果用戶將視圖拖動到屏幕的一半,視圖將自動拖動到左角以放棄它,但如果用戶不拖動到屏幕的一半,它將返回到屏幕右側的角落。 這裏很少迷失,任何教程或什麼? 感謝UIGestureRecognizer拖動UIView

編輯:繼承人一些代碼,它是一個UIImageView,一個UIScrollView裏面,我需要拖動裏面的全卷或只是形象:

_myScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, self.window.bounds.size.height)]; [_myScroll setContentSize:CGSizeMake(self.window.bounds.size.width , 1300)]; 

_tutorial = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, 1300)]; [_tutorial setImage:[UIImage imageNamed:@"Default"]]; 
_tutorial.contentMode = UIViewContentModeScaleAspectFit; [_myScroll addSubview:_tutorial]; 

_tutorial.userInteractionEnabled = YES; 
    UIPanGestureRecognizer * recognizer = [[UIPanGestureRecognizer alloc]initWithTarget:_tutorial action:@selector(handlePan:)]; 
[_tutorial addGestureRecognizer:recognizer]; 

    [self.window addSubview:_myScroll]; 

而且方法我嘗試拖動UIImageView

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer { 

    CGPoint translation = [recognizer translationInView:_myScroll]; 
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, 
             recognizer.view.center.y + translation.y); 
    [recognizer setTranslation:CGPointMake(0, 0) inView:_myScroll]; 

} 
+0

我回答了你的問題,但是你應該給你更多的細節,比如「我可以拖動視圖,但不知道如何使它到正確的位置」,... – rdurand

+0

@ rdurand是的,我可以使用UIPanGestureRecognizer拖動視圖,但我不知道如何檢測位置,然後將視圖發送到所需的位置。第二個問題是,如何拖動視圖,只能水平地提供 – darkman

+0

提供一些代碼。告訴我們你試過了什麼,什麼*不行*。 – rdurand

回答

22

看看here。這是一個UIGestureRecognizer教程,它將爲您提供處理捏和平移手勢的基礎知識。一旦你瞭解了基礎知識,就可以很容易地完成你想要的任務。所有你需要的是一旦平底鍋完成後檢查視圖的位置,將其發送到正確的位置。看看UIScrollViews上的this other tutorial,它可以幫助你找到通過第二部分的方法。

這兩個教程都來自raywenderlich.com,可能是我知道的最有用的iOS教程網站。


這裏是您handlePan:方法的一些代碼,您可以在工作:

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer { 

    CGPoint translation = [recognizer translationInView:_myScroll]; 

    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, 
             recognizer.view.center.y + translation.y); 

    if (recognizer.state == UIGestureRecognizerStateEnded) { 

     // Check here for the position of the view when the user stops touching the screen 

     // Set "CGFloat finalX" and "CGFloat finalY", depending on the last position of the touch 

     // Use this to animate the position of your view to where you want 
     [UIView animateWithDuration: aDuration 
           delay: 0 
          options: UIViewAnimationOptionCurveEaseOut 
         animations:^{ 
      CGPoint finalPoint = CGPointMake(finalX, finalY); 
      recognizer.view.center = finalPoint; } 
         completion:nil]; 
    } 


    [recognizer setTranslation:CGPointMake(0, 0) inView:_myScroll]; 

} 

我不會給你完美的答案在這裏,你必須對代碼工作,以找到一個讓它按照你想要的方式工作。

這是最後一個提示。您可以使用slideFactor進行某種「平滑」動畫。它會幫助你的動畫更「現實」。在此代碼的工作,你就在「如果」的開頭添加:

CGPoint velocity = [recognizer velocityInView:self.view]; 
CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y)); 
CGFloat slideMult = magnitude/200; 

float slideFactor = 0.1 * slideMult; // Increase for more slide 

然後在UIView的animateWithDuration:,使用slideFactor的持續時間。