2010-09-22 4 views
8

Wir wissen, dass UIImageView eine sehr gute Unterstützung für Bildsequenzanimation hat. Wir können leicht ein Array von UIImage-Objekten erstellen, die animationImages-Eigenschaft festlegen, die Animationsdauer konfigurieren, die Anzahl der Wiederholungen usw. festlegen und dann einfach auslösen. Aber es scheint keine Möglichkeit zu geben zu wissen, wann diese Animation beendet ist.iPhone: Der beste Weg, um das Ende von UIImageView Bildsequenzanimation zu erkennen

Sagen wir, ich habe zehn Bilder und dann möchte ich eine Animation (Wiederholung count = 1) mit ihnen ausführen. Und wenn die Animation vorbei ist, möchte ich einen anderen Code ausführen. Was ist der beste Weg zu wissen, dass die Animation beendet ist?

Ich verstehe schon, dass ich eine NSTimer erstellen und planen kann, nach der Animationsdauer zu feuern. Aber Sie können sich wirklich nicht auf Timer verlassen, wenn Sie gute Präzision brauchen.

Also meine Frage ist, gibt es eine bessere Möglichkeit zu wissen, dass eine UIImageView Bildsequenz-Animation ohne Verwendung des Timers beendet wurde?

Der Code ist so etwas wie dieses

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

[myImageView startAnimating] 
+0

mit einem Beispielcode bearbeitet – taskinoor

+1

Haben Sie tatsächlich versucht, einen Timer zu verwenden? Es ist wahr, dass das Timing nicht 100% genau ist, aber AFAIK kann man sich auch nicht auf das Timing anderer Animationen verlassen. Ich wäre nicht überrascht, wenn die integrierte UIImageView-Animation selbst einen Timer verwendet. –

+0

ya ich habe Timer versucht. Genau das benutze ich gerade jetzt. das ist in vielen Fällen in Ordnung, aber gut ... nicht 100% :-) – taskinoor

Antwort

8

Die isAnimating Eigenschaft auf UIImageView NO gehen sollte, wenn es Animieren getan hat. Es ist jedoch keine formale Eigenschaft, daher kann man keine Beobachtung darauf aufbauen. Sie können es auf einem feinkörnigen Timer abfragen (wie CADisplayLink).

Es gibt keine "Animation abgeschlossen" Delegate für diese, wenn das die Art von was Sie suchen. Das Timing kann basierend auf der Ladeverzögerung der Bilder usw. variieren, und nein, es gibt keine sichere Methode, um genau zu wissen, wann es fertig ist.

Die Bildanimation Zeug auf UIImageView ist eine Bequemlichkeit, und nicht schwer genug, um ernsthafte Animation mit zu tun. Erwägen Sie, Ihre eigenen zu rollen, wenn Sie diese Art von Präzision benötigen.

+0

ya, ich denke auch, dass ich irgendwann alleine damit umgehen muss. wollte nur sicher sein, dass ich nichts vermisse und es keinen alternativen Weg gibt. – taskinoor

+0

Nicht sicher, was Sie mit "formales Eigentum" meinen. Es ist definitiv eine Eigenschaft, aber UIImageView ruft wahrscheinlich den Setter nicht an (ich vermute, dass es keinen gibt). –

1

Ich habe dies (Methode meiner UIImageView-Unterklasse) gemacht.

-(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(); }); 

    }); 
} 

Einfache Nutzung:

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

Einer der schlimmsten Hacks: Die while-Schleife wird eine CPU (bis zu 100%) schwächen und die Batterie schnell entladen. – CouchDeveloper

+0

Yap eigentlich ist diese "Endlosschleife" nicht die beste Idee, auch nicht im Hintergrund. Es hängt sowieso davon ab, dass ich das nur für Sekunden benutzt habe. – Geri

+1

Sie könnten ein 'usleep (10000);' hinzufügen, um das Problem zu beheben. Andernfalls nehmen Sie das Risiko auf sich, die Ursache der Batterieprobleme auf Apple-Geräten zu sein: P – CouchDeveloper

0

Außerdem könnte ich empfehlen Standard-Image des UIImageView (Eigenschaft image) auf dem ersten Bild der Animation einstellen und es zum letzten Frame unmittelbar nach dem Start der Animation zu ändern (startAnimating Methode). Auf diese Weise vermeiden wir den hässlichen Blick, der auftreten kann, wenn die Animation beendet ist, aber der Callback nicht aufgerufen wird.

Verwandte Themen