5

Sono bloccato da un compito molto semplice, voglio che un'animazione UIView si allenti facilmente, ma è sempre lineare nonostante si usi l'opzione animationOption corretta.Curva di animazione UIView non funzionante easinout

Ecco il codice che dovrebbe funzionare per tutti gli account, è impostato in una classe UIViewControllerAnimatedTransitioning ma ho lo stesso problema in una precedente classe personalizzata successiva;

[UIView animateWithDuration:0.4f delay:0.0f options:UIViewAnimationOptionCurveEaseInOut animations:^(void) { 

     self.dimView.alpha = 1.0; 
     self.imageView.frame = self.destinationRect; 

    } completion:^(BOOL finished) { 

     [self.imageView removeFromSuperview]; 
     [self.dimView removeFromSuperview]; 

     [transitionContext completeTransition:YES]; 

    }]; 

Tuttavia, un'animazione primavera con il seguente codice funziona anche se io preferisco non farlo.

[UIView animateWithDuration:0.8f delay:0 usingSpringWithDamping:0.7f initialSpringVelocity:2.0f options:UIViewAnimationOptionCurveEaseInOut animations:^(void) { 

     self.dimView.alpha = 1.0; 
     self.imageView.frame = self.destinationRect; 

    } completion:^(BOOL finished){ 

     [self.imageView removeFromSuperview]; 
     [self.dimView removeFromSuperview]; 

     [transitionContext completeTransition:YES]; 

    }]; 

sto ottenendo lo stesso comportamento sul simulatore e su un dispositivo di test iPad2. Sto facendo qualcosa di sbagliato? Ci sono problemi con l'animazione dei valori frame o alpha?

risposta

3

Si potrebbe provare questo instead.-

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationBeginsFromCurrentState:YES]; 
[UIView setAnimationDuration:0.4f]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationDidStopSelector:@selector(animationDidStop)]; 

self.dimView.alpha = 1.0; 
self.imageView.frame = self.destinationRect; 

[UIView commitAnimations]; 

- (void) animationDidStop { 
    [self.imageView removeFromSuperview]; 
    [self.dimView removeFromSuperview]; 
    [transitionContext completeTransition:YES]; 
} 

Speranza che aiuta.

+0

Grazie ssantos. All'inizio ho pensato che fosse il trucco ma i miei occhi mi prendevano in giro. Ancora decisamente lineare. Molto strano e fastidioso. –

+0

Mmmh davvero strano, può la distanza essere troppo piccola per notare la differenza? Proverei un'animazione 'grande' con diversi 'animationCurves' per ogni evenienza. – ssantos

1

È possibile utilizzare il seguente:

[auto transizione: a sinistra]; // chiamata come richiesto

enum animationFrom { 
    top, 
    bottom, 
    left, 
    right 
}; 

- (void)transition:(NSUInteger)index { 
    CATransition *tr=[CATransition animation]; 
    tr.duration=0.45; 
    tr.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    tr.type=kCATransitionPush; 
    tr.delegate=self; 
    switch (index) { 
     case top: 
      tr.subtype=kCATransitionFromBottom; 
      break; 
     case bottom: 
      tr.subtype=kCATransitionFromTop; 
      break; 
     case left: 
      tr.subtype=kCATransitionFromRight; 
      break; 
     case right: 
      tr.subtype=kCATransitionFromLeft; 
      break; 
     default: 
      break; 
    } 
    [self.view.layer addAnimation:tr forKey:nil]; 
} 
1

L'opzione predefinita curva di animazione è UIViewAnimationOptionCurveEaseInOut, quindi non è necessario specificare questo. È UIViewAnimationOptionCurveLinear di cui devi essere esplicito.

Sei sicuro che la curva di animazione sia lineare? Prova ad animare le due viste laterali, con la durata dell'animazione impostata su alcuni secondi.

Problemi correlati