2009-01-03 31 views
6

için yardıma ihtiyacım var. IPhone'da bir uygulama geliştiriyorum ve içinde çok sayıda UIView ve katman var. CAKeyframeAnimation sınıfını kullanarak bazı animasyonlar yapıyorum ve animasyonların zincirlenmesi gerektiğinden, UIView'deki animationDidStop yöntemini geçersiz kıldım.Animasyon Geri Arama (iPhone)

Geri aramaları düzgün bir şekilde alıyorum, ancak hangi animasyonu sonlandıracağımı anlayamadım, böylece bir diğerine başlayabileceğim. Sadece geriçağırım işlevi için parametreler bir CAAnimation nesnesi ve bir booledir.

Sınıfta bir özellik ayarlayarak ve kullandığım çeşitli animasyonlar için bir enum kullanarak bu sorunu geçici olarak çözebilirim. Ancak sadece CAKeyframeAnimation nesnesinde ayarlayabildiğim geri aramalarda herhangi bir yerleşik özellik bulunup bulunmadığını öğrenmek ve daha sonra geri aramada aynı şekilde başvurmak istedim.

Herhangi bir yardım büyük takdir!

cevap

11

CAKeyframeAnimations kullandığınızı, ancak UIView özelliklerinin (kaynak, sınır, alfa vb.) Basit animasyonunu istiyorsanız, özellik veya özellik değişimini başlangıç ​​/ bloğu işleyin ve animasyonu tamamladıktan sonra çağrılan bir temsilci yöntemi belirtin. Temsilci yöntemi üç argüman aldığında, ne istersen onu arayabilirsin. Örneğin:

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:ANIMATIONDURATIONINSECONDS]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationDidStopSelector:@selector(yourAnimationHasFinished:finished:context:)]; 
// Change property or properties here 
[UIView commitAnimations]; 

- (void)yourAnimationHasFinished:(NSString *)animationID finished:(BOOL)finished context:(void *)context; 

çağrılacak yöntemi neden olur. Bu izin veren isteğe bağlı adlandırma, farklı animasyonların tamamlanması için işleme ayrılmasını sağlar. Bunu basit animasyonlar için tercih ederim.

, CALayers doğrudan animationDidStop etkileşim daha karmaşık animasyonlar ile ilgilenen için

: tamamladı: temsilci yöntemi tamamlandıktan animasyon nesnesi geri yapar. Birden çok animasyon için temsilci olan bir örnek oluşturuyorsanız, animDidStop: finished: method içindeki anahtar deyiminde kullanmak için bir NSMutableDictionary animations ve NSNumbers oluşturabilirsiniz. Eğer CAKeyframeAnimation oluştururken, setObject kullanın: forKey: o zaman, onun eşleşen numarasına atamak objectForKey kullanmak: tamamlanma yönteminde olduğu animasyon karşılık gelen sayıyı bulup bir switch deyimi içine beslemek için.

13

Bir animasyon için bir ad belirtin ve temsilci yönteminde okuyabilirsiniz.

[animation setValue:"firstAnimation" forKey:@"name"]; 

...

- (void)animationDidStop:(CAAnimation*)animation finished:(BOOL)finished { 
    if([[animation valueForKey:@"name"] isEqual:@"firstAnimation"] && finished) { 
    ... 
    } 
} 
+1

bunu düzenlemek edemedim, ama çizgiye "firstAnimation" önce @ ihtiyacı [animasyon setValue: "firstAnimation" forKey: "isim" @]; – efeyc