2010-09-22 7 views
8

Wiemy, że UIImageView ma bardzo dobre wsparcie dla animacji sekwencji obrazów. Możemy łatwo utworzyć tablicę obiektów UIImage, ustawić właściwość animationImages, skonfigurować czas trwania animacji, liczbę powtórzeń itp., A następnie po prostu odpalić. Ale wydaje się, że nie sposób dowiedzieć się, kiedy ta animacja się skończyła.iPhone: Najlepszy sposób na wykrycie końca sekwencji animacji obrazów UIImageView

Powiedz, że mam dziesięć zdjęć, a następnie chcę uruchomić z nimi animację (powtórz liczbę = 1). A kiedy animacja się skończy, chcę uruchomić inny kod. Jaki jest najlepszy sposób na stwierdzenie, że animacja się skończyła?

Rozumiem już, że mogę utworzyć NSTimer i zaplanować jego uruchomienie po czasie trwania animacji. Ale naprawdę nie możesz polegać na timerze, jeśli potrzebujesz dobrej precyzji.

Moje pytanie brzmi: czy istnieje lepszy sposób na stwierdzenie, że animacja sekwencji obrazów UIImageView została zakończona bez korzystania z licznika czasu?

Kod jest coś takiego

 
myImageView.animationImages = images; // images is a NSArray of UIImages 
myImageView.animationDuration = 2.0; 
myImageView.animationRepeatCount = 1; 

[myImageView startAnimating] 
+0

edytowany za pomocą przykładowego kodu – taskinoor

+1

Czy próbowałeś już używać timera? To prawda, że ​​czas nie jest w 100% dokładny, ale AFAIK nie może polegać na taktowaniu innych animacji. Nie zdziwiłbym się, gdyby wbudowana animacja UIImageView korzystała z samego timera. –

+0

ya próbowałem timer. w rzeczywistości to właśnie teraz używam. to jest dobre dla wielu przypadków, ale dobrze ... nie 100% :-) – taskinoor

Odpowiedz

8

Obiekt isAnimating na UIImageView powinien udać się do NO kiedy to zrobić animację. Nie jest to jednak formalna właściwość, więc nie można ustawić na niej obserwacji. Możesz sondować go na precyzyjnym zegarze (takim jak CADisplayLink).

Nie ma w tym celu delegata "pełnej animacji", jeśli tego właśnie szukasz. Czas może być zmienny w zależności od opóźnienia ładowania zdjęć itp., A nie, nie ma pewności, jak dokładnie określić, kiedy to się stanie.

Obrazy animacji na UIImageView to wygoda, a nie waga ciężka, z którą można pracować. Zastanów się, czy nie toczyć własnych, jeśli potrzebujesz takiej precyzji.

+0

Ya, ja również uważam, że w końcu muszę poradzić sobie z tym samodzielnie. chciałem tylko mieć pewność, że niczego nie brakuje i nie ma innej drogi. – taskinoor

+0

Nie wiesz, co masz na myśli przez "formalną własność". Jest to z pewnością właściwość, ale UIImageView prawdopodobnie nie wywołuje osoby ustawiającej (podejrzewam, że jej nie ma). –

1

Zrobiłem to (metoda mojej podklasy UIImageView).

-(void)startAnimatingWithCallback:(UIImageViewAnimationCompletitionBlock) completitionCallback 
{ 
    [self startAnimating]; 

    dispatch_queue_t animatingQueue = dispatch_get_current_queue(); 
    dispatch_queue_t pollingQueue = dispatch_queue_create("pollingQueue", NULL); 
    dispatch_async(pollingQueue, ^{ 

     while(self.isAnimating) { usleep(10000); } 
     dispatch_async(animatingQueue, ^{ if (completitionCallback) completitionCallback(); }); 

    }); 
} 

Proste użycie:

[self.oneView fadeOut]; 
[self.otherView startAnimatingWithCallback:^ 
{ 
    [self.oneView fadeIn]; 
}]; 
+0

Jeden z najgorszych hacków: pętla while wyniesie jeden procesor (do 100%) i szybko rozładuje baterię. – CouchDeveloper

+0

Yap właściwie ta pętla "endlessie" nie jest najlepszym pomysłem nawet w tle. Zależy to zresztą od tego, że używałem tego tylko przez kilka sekund. – Geri

+1

Można dodać 'usleep (10000);' w celu złagodzenia problemu. W przeciwnym razie ryzykujesz, że zostaniesz obciążony za przyczynę problemów z baterią urządzeń Apple: P – CouchDeveloper

0

Ponadto mogę polecić ustawienie domyślnego obrazu UIImageView (własność image) na pierwszej klatce animacji i zmieniając go do ostatniej klatki tuż po uruchomieniu animacji (Metoda startAnimating). W ten sposób unikniemy brzydkiego bloga, który może wystąpić, gdy animacja zostanie zakończona, ale wywołanie zwrotne nie zostanie wywołane.

Powiązane problemy