2014-08-28 7 views
5

Ich versuche, einen Effekt zu erstellen, bei dem drei Pfeile abwechselnd von sichtbar zu unsichtbar gehen.Seltsames Verhalten beim Animieren einer UIView mit [UIView animateKeyframesWithDuration]

Ich machte einen einfachen Algorithmus, bei dem jeder Pfeil von einem anderen Alpha-Wert ausgeht (wenn es 3 Pfeile gibt, würde der erste bei Alpha = 1 beginnen, der zweite bei Alpha = 0,6667, der dritte bei Alpha = 0,3337). Ich beginne dann eine Keyframe-Animation, die:

  • Ändern Sie den Pfeil Opazität von seinem aktuellen Alpha auf 0 (die Dauer berechnet wird)
  • sofort der Pfeil Opazität Wird auf 1 gesetzt
  • Ändern Sie den Pfeil Opazität von 1 bis zum ersten Wert

Es scheint jedoch, dass einige Schritte aus irgendeinem Grund übersprungen werden.

Ein einfaches Beispiel:

[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 diesem Fall ist es sofort auf 0,5 gehen sollte, 0,5-0 in 1 Sekunde, gehen Sie zu 1 sofort, 1 bis 0,5 in 1 Sekunde. Es sollte daher einen nahtlosen Übergang geben, der so aussieht, als ob die Ansicht erscheint und verschwindet, aber es sieht so aus, als würde die Animation für einige Zeit auf Alpha = 0,5 hängen bleiben.

Theoretisch sollte der Effekt das gleiche sein wie wenn diese Keyframe-Animation mit:

[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

Was Sie versuchen, zu tun ist vergleichbar mit der Verwendung von Animationsgruppen mit relativem Animationsstart und Laufzeitversatz. Ich habe das schon einmal versucht. Versuchen, einen nahtlosen Übergang zwischen 4 verschiedenen Pfaden innerhalb einer Formebene zu animieren. Meine Erfahrung ist, dass sie aus irgendeinem Grund nicht richtig funktionieren (ich habe viel versucht). Also habe ich dann eine eigene Completion-Block-Logik für die Layer geschrieben und innerhalb dieser eine Animation nach der Fertigstellung der anderen ausgelöst. Der Code sah ein bisschen dumm aus, aber die Animation funktionierte wie ein Zauber :). Vielleicht können Sie das gleiche versuchen. – croyneaus4u

Antwort

0

Falls Sie N Ansichten auf die gleiche Art und Weise animiert werden sollen:

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

Dies ist die genaue Implementierung, die ich gemacht habe, und das funktioniert aus irgendeinem Grund nicht richtig. Der erste Pfeil funktioniert korrekt, die anderen nicht. Obwohl der Effekt auf alle Pfeile irgendwie OK ist, wenn Sie sich jeden Pfeil ansehen, werden Sie sehen, dass einige keinen nahtlosen Alpha Übergang von 1 zu 0 machen. – rFlex

+0

Also Animation aller Pfeile (außer dem ersten) ist nicht genug nahtlos? Ist das das einzige Problem? –

+0

Ja, wenn du genau hinsiehst, erreichen einige Ansichten niemals 0 und bleiben für einige Zeit auf ihrem Start-Alpha stecken. – rFlex