2014-08-28 12 views
5

Sto provando a creare un effetto in cui tre frecce passano dal visibile all'invisibile in alternativa.Strano comportamento che anima un UIView usando [UIView animateKeyframesWithDuration]

Ho creato un semplice algoritmo in cui ogni freccia inizia da un valore alfa diverso (se sono presenti 3 frecce, la prima parte da alfa = 1, la seconda da alfa = 0.6667, la terza da alfa = 0,3337). Sono poi inizio un'animazione fotogramma chiave che:

  • Modifica la freccia opacità dalla alfa corrente a 0 (la durata è calcolata)
  • impostare immediatamente la freccia opacità a 1
  • modificare l'opacità freccia da 1 al primo set di valori

Tuttavia sembra che alcuni passaggi vengano saltati per qualche motivo.

Un semplice esempio:

[UIView animateKeyframesWithDuration:2 delay:0 options:UIViewKeyframeAnimationOptionCalculationModeLinear | UIViewKeyframeAnimationOptionRepeat animations:^{ 

    [UIView addKeyframeWithRelativeStartTime:0 relativeDuration:0 animations:^{ 
     _animatedView.alpha = 0.5; 
    }]; 

    [UIView addKeyframeWithRelativeStartTime:0 relativeDuration:0.5 animations:^{ 
     _animatedView.alpha = 0; 
    }]; 

    [UIView addKeyframeWithRelativeStartTime:0.5 relativeDuration:0 animations:^{ 
     _animatedView.alpha = 1; 
    }]; 

    [UIView addKeyframeWithRelativeStartTime:0.5 relativeDuration:0.5 animations:^{ 
     _animatedView.alpha = 0.5; 
    }]; 

} completion:nil]; 

In questo caso dovrebbe andare a 0,5 istantaneamente, 0,5 a 0 in 1 secondo, vai a 1 istantaneamente, 1 a 0,5 a 1 secondo. Dovrebbe quindi fare una transizione senza soluzione di continuità che assomigli alla visualizzazione e alla scomparsa della vista, ma sembra che l'animazione si blocchi su alfa = 0.5 per un po 'di tempo.

Teoricamente, l'effetto dovrebbe essere lo stesso come se si utilizza questa animazione fotogramma chiave:

[UIView animateKeyframesWithDuration:2 delay:0 options:UIViewKeyframeAnimationOptionCalculationModeLinear | UIViewKeyframeAnimationOptionRepeat animations:^{ 
    [UIView addKeyframeWithRelativeStartTime:0 relativeDuration:0 animations:^{ 
     _animatedView.alpha = 1; 
    }]; 
    [UIView addKeyframeWithRelativeStartTime:0 relativeDuration:1 animations:^{ 
     _animatedView.alpha = 0; 
    }]; 
} completion:nil]; 
+0

cosa si sta cercando è simile all'utilizzo di gruppi di animazione con l'inizio relativo all'animazione e l'offset di durata. Ho provato a fare lo stesso una volta. cercando di animare una transizione senza soluzione di continuità tra 4 diversi percorsi all'interno di un livello forma. La mia esperienza è che non funzionano correttamente per qualche motivo (ho provato molto). Così ho scritto la mia logica di blocco di completamento per i livelli e all'interno ho attivato un'animazione dopo il completamento dell'altro. Il codice sembrava un po 'stupido, ma l'animazione ha funzionato come un fascino :). Quindi forse puoi provare la stessa cosa. – croyneaus4u

risposta

0

Nel caso in cui si desidera animare viste N nello stesso modo:

CGFloat count = [self.animatedViews count]; 
CGFloat period = 1.0f/count; 

__weak NSArray *weakViews = self.animatedViews; 

[UIView animateKeyframesWithDuration:2.0f delay:0 options:UIViewKeyframeAnimationOptionCalculationModeLinear | UIViewKeyframeAnimationOptionRepeat animations:^{ 

    for (NSUInteger index = 0; index < count; ++index) { 
     UIView *animatedView = weakViews[index]; 

     CGFloat startDelay = period * index; 

     [UIView addKeyframeWithRelativeStartTime:0 relativeDuration:0 animations:^{ 
      animatedView.alpha = startDelay; 
     }]; 

     [UIView addKeyframeWithRelativeStartTime:0.0f relativeDuration:startDelay animations:^{ 
      animatedView.alpha = 0.0f; 
     }]; 

     [UIView addKeyframeWithRelativeStartTime:startDelay relativeDuration:0.0f animations:^{ 
      animatedView.alpha = 1.0f; 
     }]; 

     [UIView addKeyframeWithRelativeStartTime:startDelay relativeDuration:(1.0f - startDelay) animations:^{ 
      animatedView.alpha = startDelay; 
     }]; 
    } 
} completion:nil]; 
+0

Questa è l'esatta implementazione che ho fatto e questo non funziona correttamente per qualche motivo. La prima freccia funziona correttamente e gli altri no. Anche se l'effetto su tutte le frecce sembra ok, se guardi ciascuna freccia vedrai che alcuni non eseguono una transizione alpha senza interruzioni da 1 a 0. – rFlex

+0

Quindi l'animazione di tutte le frecce (eccetto la prima) non è sufficiente senza soluzione di continuità? È questo l'unico problema? –

+0

Sì, se si guarda da vicino, alcune visualizzazioni non raggiungono mai 0 e rimangono bloccate sull'alfa di partenza per qualche tempo. – rFlex