2014-08-28 17 views
5

Próbuję stworzyć efekt, w którym trzy strzały zmieniają się z widocznych na niewidoczne na przemian.Dziwne zachowanie przy animacji UIView przy użyciu [UIView animateKeyframesWithDuration]

Zrobiłem prosty algorytm, w którym każda strzałka zaczynałaby się od innej wartości alfa (jeśli są 3 strzały, pierwsza zaczynałaby się od alfa = 1, druga w alfa = 0.6667, trzecia w alfa = 0,3337). I wtedy zaczynają kluczową animacji klatek że:

  • Zmień krycie strzałka z bieżącej alfa 0 (czas trwania jest obliczany)
  • ustawiona natychmiast strzałka krycie do 1
  • Zmian strzałki krycie od 1 do pierwszego zestawu wartości

Wygląda jednak na to, że niektóre kroki są pomijane z jakiegoś powodu.

Prosty przykład:

[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]; 

W tym przypadku należy przejść do 0,5 natychmiast 0,5 do 0 w ciągu 1 sekundy, przejdź do 1 natychmiast 1 do 0,5 do 1 sekundy. Powinno więc wykonać płynne przejście, które wygląda tak, jakby widok pojawiał się i znikał, ale wygląda na to, że animacja utknęła na alpha = 0.5 przez kilka chwil.

Teoretycznie, efekt powinien być taki sam, jak w przypadku korzystania z tego klucza animacji klatek:

[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

co chce Czynność ta jest podobna do korzystania z grup animacji z względnym przesunięciem początkowym i czasowym animacji. Próbowałem zrobić to samo wcześniej. próbuje animować płynne przejście między 4 różnymi ścieżkami w warstwie kształtu. Z mojego doświadczenia wynika, że ​​z jakiegoś powodu nie działają prawidłowo (dużo próbowałem). Napisałem więc własną logikę bloku ukończenia dla warstw i w tym czasie uruchomiłem jedną animację po zakończeniu drugiej. Kod wyglądał trochę głupio, ale animacja działała jak urok :). Więc może możesz spróbować tak samo. – croyneaus4u

Odpowiedz

0

w przypadku chcesz animować N poglądy w taki sam sposób:

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

To jest dokładna implementacja, którą zrobiłem i to nie działa poprawnie z jakiegoś powodu. Pierwsza strzałka działa poprawnie, inne nie. Chociaż efekt na wszystkich strzałach wygląda na całkiem OK, jeśli spojrzysz na każdą ze strzał, zobaczysz, że niektórzy nie robią płynnego przejścia alfa od 1 do 0. – rFlex

+0

Tak więc animacja wszystkich strzałek (oprócz pierwszej) nie jest wystarczająca bezszwowy? Czy to jedyny problem? –

+0

Tak, jeśli przyjrzysz się uważnie, niektóre widoki nigdy nie osiągną 0 i utkną na swoim alfie startowym przez kilka chwil. – rFlex

Powiązane problemy