2013-06-13 13 views
9

Próbuję przenieść widok podrzędny na ekranie, który działa, ale chcę również dodać bezwładność lub pęd do obiektu.
Mój kod UIPanGestureRecognizer, który już mam, znajduje się poniżej.Dodawanie bezwładności do UIPanGestureRecognizer

Z góry dziękuję.

UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self  action:@selector(handlePan:)]; 
[self addGestureRecognizer:panGesture]; 

(void)handlePan:(UIPanGestureRecognizer *)recognizer 
{ 

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

    if (recognizer.state == UIGestureRecognizerStateEnded) { 
     [self.delegate card:self.tag movedTo:self.frame.origin]; 
    } 
} 

Jeszcze raz dziękuję.

Odpowiedz

4

Spójrz na RotationWheelAndDecelerationBehaviour. istnieje przykład, jak wykonać spowolnienie zarówno dla panoramowania liniowego, jak i ruchu obrotowego. Sztuczka polega na sprawdzeniu, jaka jest prędkość, kiedy użytkownik kończy dotyk i kontynuuje w tym kierunku z małym opóźnieniem.

+0

To nie jest bardzo dokładna odpowiedź. Sugeruję przeczytanie [** jak odpowiedzieć **] (http://stackoverflow.com/questions/how-to-answer) i rozwinięcie go. – brandonscript

+0

To jest o wiele lepsza odpowiedź http://stackoverflow.com/a/6614319/558575 – amergin

1

Cóż, nie jestem profesjonalistą, ale sprawdzając wiele odpowiedzi, udało mi się stworzyć własny kod, z którego jestem zadowolony.

Proszę mi powiedzieć, jak to poprawić i czy są jakieś złe praktyki, których używałem.

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

CGPoint translatedPoint = [recognizer translationInView:self.postViewContainer]; 
CGPoint velocity = [recognizer velocityInView:recognizer.view]; 

float bottomMargin = self.view.frame.size.height - containerViewHeight; 
float topMargin = self.view.frame.size.height - scrollViewHeight; 

if ([recognizer state] == UIGestureRecognizerStateChanged) { 

    newYOrigin = self.postViewContainer.frame.origin.y + translatedPoint.y; 

    if (newYOrigin <= bottomMargin && newYOrigin >= topMargin) { 
     self.postViewContainer.center = CGPointMake(self.postViewContainer.center.x, self.postViewContainer.center.y + translatedPoint.y); 
    } 
    [recognizer setTranslation:CGPointMake(0, 0) inView:self.postViewContainer]; 
} 

if ([recognizer state] == UIGestureRecognizerStateEnded) { 

    __block float newYAnimatedOrigin = self.postViewContainer.frame.origin.y + (velocity.y/2.5); 

    if (newYAnimatedOrigin <= bottomMargin && newYAnimatedOrigin >= topMargin) { 
     [UIView animateWithDuration:1.2 delay:0 
          options:UIViewAnimationOptionCurveEaseOut 
         animations:^ { 
          self.postViewContainer.center = CGPointMake(self.postViewContainer.center.x, self.postViewContainer.center.y + (velocity.y/2.5)); 
         } 
         completion:^(BOOL finished) { 
          [self.postViewContainer setFrame:CGRectMake(0, newYAnimatedOrigin, self.view.frame.size.width, self.view.frame.size.height - newYAnimatedOrigin)]; 
         } 
     ]; 
    } 
    else { 
     [UIView animateWithDuration:0.6 delay:0 
          options:UIViewAnimationOptionCurveEaseOut 
         animations:^ { 
          if (newYAnimatedOrigin > bottomMargin) { 
           self.postViewContainer.center = CGPointMake(self.postViewContainer.center.x, bottomMargin + self.postViewContainer.frame.size.height/2); 
          } 

          if (newYAnimatedOrigin < topMargin) { 
           self.postViewContainer.center = CGPointMake(self.postViewContainer.center.x, topMargin + self.postViewContainer.frame.size.height/2); 
          } 
         } 
         completion:^(BOOL finished) { 
          if (newYAnimatedOrigin > bottomMargin) 
           [self.postViewContainer setFrame:CGRectMake(0, bottomMargin, self.view.frame.size.width, scrollViewHeight)]; 

          if (newYAnimatedOrigin < topMargin) 
           [self.postViewContainer setFrame:CGRectMake(0, topMargin, self.view.frame.size.width, scrollViewHeight)]; 
         } 
     ]; 
    } 
} 

}

Użyłem dwóch różnych animacji, jeden jest domyślnym bezwładność jedno i drugie, jeśli dla kiedy użytkownik rzuca się containerView z dużą prędkością.

Działa dobrze pod iOS 7.