2013-06-13 18 views
9

Ich versuche, eine Unteransicht über den Bildschirm, die funktioniert, aber ich möchte auch Trägheit oder Schwung zum Objekt hinzufügen.
Mein UIPanGestureRecognizer Code, den ich bereits habe, ist unten.Hinzufügen von Trägheit zu einem UIPanGestureRecognizer

Vielen Dank im Voraus.

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]; 
    } 
} 

Nochmals vielen Dank.

Antwort

4

Werfen Sie einen Blick auf RotationWheelAndDecelerationBehaviour. Es gibt ein Beispiel dafür, wie die Verzögerung sowohl für das lineare Schwenken als auch für die Drehbewegung ausgeführt werden kann. Trick ist es, die Geschwindigkeit zu sehen, wenn der Benutzer die Berührung beendet und in dieser Richtung mit einer kleinen Verzögerung fortfährt.

+0

Dies ist keine sehr gründliche Antwort. Ich schlage vor, Sie lesen [** wie Sie antworten **] (http://stackoverflow.com/questions/how-to-answer) und erweitern es. – brandonscript

+0

Dies ist eine viel bessere Antwort http://stackoverflow.com/a/6614319/558575 – amergin

1

Nun, ich bin kein Profi, aber, mehrere Antworten überprüfend, habe ich es geschafft, meinen eigenen Code zu erstellen, mit dem ich glücklich bin.

Bitte sagen Sie mir, wie ich es verbessern kann und ob es irgendwelche schlechten Praktiken gibt, die ich verwendet habe.

- (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)]; 
         } 
     ]; 
    } 
} 

}

ich zwei verschiedene Animation verwendet haben, ist die Standard-Trägheit eine und das andere, wenn für, wenn der Benutzer die containerView mit hoher Geschwindigkeit schleudert.

Es funktioniert gut unter iOS 7.