Aggiornamento: Anche se mi piace ancora di risolvere questo problema, ho finito per passare a animateWithDuration:delay:options:animations:completion:
e funziona molto più bello. Manca quel bel "rimbalzo" alla fine che la molla offre, ma almeno è controllabile.UIView animazione con UIPanGestureRecognizer modo velocità troppo veloce (non in decelerazione)
Sto cercando di creare un bel gesto UI-driven per iOS, ma sono in esecuzione in alcune difficoltà che ottengono i valori di provocare una bella app sentimento naturale.
Sto usando animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:
perché mi piace l'animazione molla rimbalzante. Sto inizializzando l'argomento velocity
con la velocità data dal riconoscitore di gesti nello stato completato. Il problema è che se faccio una panoramica abbastanza veloce e lascia andare, la velocità è a migliaia, e la mia vista finisce volando fuori dallo schermo e poi rimbalza avanti e indietro con una vendetta così vertiginosa.
Sto persino regolando la durata dell'animazione in relazione alla quantità di distanza che la vista deve spostare, in modo che se ci sono solo pochi pixel necessari, l'animazione impiegherà meno tempo. Ciò, tuttavia, non ha risolto il problema. Continua a diventare matto.
Quello che voglio accadere è la vista dovrebbe iniziare a qualsiasi velocità l'utente è trascinandolo a, ma dovrebbe decelerare rapidamente quando si raggiunge il punto di destinazione e rimbalzare solo un po 'alla fine (come fa se la velocità è qualcosa di ragionevole).
Mi chiedo se sto usando questo metodo oi valori correttamente. Ecco un codice per mostrare cosa sto facendo. Qualsiasi aiuto sarebbe apprezzato!
- (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 hai mai capito come utilizzare correttamente la velocità della molla iniziale? – bogardon
No! Finito il trasporto con il singhiozzo di un frame ... – Arclite