Update: Obwohl ich das immer noch gerne lösen würde, landete ich auf animateWithDuration:delay:options:animations:completion:
und es funktioniert viel schöner. Es fehlt dieser schöne "Sprung" am Ende, den der Frühling bietet, aber zumindest ist es kontrollierbar.UIView Animation mit UIPanGestureRecognizer velocity viel zu schnell (nicht bremsend)
Ich versuche, eine nette Geste gesteuerte Benutzeroberfläche für iOS zu schaffen, aber in einige Schwierigkeiten leite die Werte immer in einem schönen natürlichen Gefühl App führen.
Ich benutze , weil ich die federnd Federanimation mag. Ich initialisiere das velocity
Argument mit der Geschwindigkeit, die durch den Gestenerkenner im vollendeten Zustand gegeben wird. Das Problem ist, wenn ich schnell genug schwenke und loslasse, ist die Geschwindigkeit in den Tausenden, und meine Ansicht fliegt vom Bildschirm und hüpft dann mit schwindelerregender Rache hin und her.
Ich justiere sogar die Dauer der Animation relativ zu der Distanz, um die sich die Ansicht bewegen muss, so dass die Animation weniger Zeit benötigt, wenn nur ein paar Pixel benötigt werden. Das hat das Problem jedoch nicht gelöst. Es endet immer noch verrückt.
Was ich möchte passieren soll, sollte die Ansicht bei welcher Geschwindigkeit der Benutzer es ziehen soll, aber es sollte schnell beim Erreichen des Zielpunktes abbremsen und nur ein wenig am Ende abprallen (wie es tut wenn die Geschwindigkeit etwas Vernünftiges ist).
Ich frage mich, ob ich diese Methode oder die Werte richtig verwende. Hier ist ein Code, um zu zeigen, was ich mache. Jede Hilfe wäre willkommen!
- (void)handlePanGesture:(UIPanGestureRecognizer*)gesture {
CGPoint offset = [gesture translationInView:self.view];
CGPoint velocity = [gesture velocityInView:self.view];
NSLog(@"pan gesture state: %d, offset: %f velocity: %f", gesture.state, offset.x, velocity.x);
static CGFloat initialX = 0;
switch (gesture.state) {
case UIGestureRecognizerStateBegan: {
initialX = self.blurView.x;
break; }
case UIGestureRecognizerStateChanged: {
self.blurView.x = initialX + offset.x;
break; }
default:
case UIGestureRecognizerStateCancelled:
case UIGestureRecognizerStateEnded: {
if (velocity.x > 0)
[self openMenuWithVelocity:velocity.x];
else
[self closeMenuWithVelocity:velocity.x];
break; }
}
}
- (void)openMenuWithVelocity:(CGFloat)velocity {
if (velocity < 0)
velocity = 1.5f;
CGFloat distance = -40 - self.blurView.x;
CGFloat distanceRatio = distance/260;
NSLog(@"distance: %f ratio: %f", distance, distanceRatio);
[UIView animateWithDuration:(0.9f * distanceRatio) delay:0 usingSpringWithDamping:0.7 initialSpringVelocity:velocity options:UIViewAnimationOptionBeginFromCurrentState animations:^{
self.blurView.x = -40;
} completion:^(BOOL finished) {
self.isMenuOpen = YES;
}];
}
hey hast du jemals herausgefunden, wie man die anfängliche Federgeschwindigkeit richtig benutzt? – bogardon
Nein! Endete Versand mit dem Ein-Rahmen-Schluckauf ... – Arclite