2008-10-28 13 views
8

Çekirdek Animasyon sizin CALayer tabanlı sınıfta actionForKey yöntemini uygulayarak özel animasyonlar için izin verir: O zamanlar bir animasyon oluşturmak ve onOrderIn eylem için iade edebilirsinizÇekirdek Animasyon'da onOrderOut için özel animasyonları nasıl kullanabilirim?

- (id<CAAction>)actionForKey:(NSString *)key { 
    // Custom animations 
    return [super actionForKey:key]; 
} 

(yani tabaka başka bir katmana eklendiğinde) . Bu gayet iyi çalışıyor. onOrderOut için aynısını yaparsam (yani katman süper katmandan çıkarılırsa), döndürülen animasyon göz ardı edilir ve bunun yerine varsayılan animasyon uygulanır. gelmez uzaklaştırmaya,

- (id<CAAction>)actionForKey:(NSString *)key { 

    if ([key isEqualToString:@"onOrderIn"] || [key isEqualToString:@"onOrderOut"]) { 
     CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
     a.duration = 0.25; 
     a.removedOnCompletion = NO; 
     a.fillMode = kCAFillModeBoth; 

     if ([key isEqualToString:@"onOrderIn"]) { 
      a.fromValue = [NSNumber numberWithFloat:0.0]; 
      a.toValue = [NSNumber numberWithFloat:1.0]; 
     } else { 
      a.fromValue = [NSNumber numberWithFloat:1.0]; 
      a.toValue = [NSNumber numberWithFloat:0.0]; 
     } 

     return a; 
    } 

    return [super actionForKey:key]; 
} 

eser yakınlaştırma:

Amacım dışarı katmanı (onOrderIn) ve (onOrderOut) Büyütmek etmektir. Bunun yerine varsayılan olarak sönen animasyon kullanılır.

Başka bir makinede yazarken, bu kod bazı yazım hataları içerebilir.

Herkes yardımcı olabilir mi?

cevap

4

quartz-dev mailing list John Harper alıntı:

animasyon çalışıyor olması gerekir zaman anahtar onOrderOut için herhangi animasyon dönen ile temel bir sorun var, katman ağaçta artık Yani etkisi yoktur. Yani, onOrderOut animasyonları tetiklemek için 'un yararı yoktur; katmanları ağaçtan kaldırıldığında diğer kodu çalıştırmak için yararlı olabilir.

Bu için bulduğum en iyi çözüm kaldırma etkisini uygulamak için özel animasyonlar eklemektir (ebeveyn varsayılan solma geçişi varsayarak bunu sık sık değil , istediğini değil) Daha sonra, didStop animasyon delegesinde, aslında katmanını kaldırın. Bu temsilci mülkiyet kümesi ile animasyonlar tek grup oluşturmak genellikle uygun tebrik ediyor ve FILLMODE = ileri, removedOnCompletion = Eğer katmanın imkanı yoktur animasyon sonunda katmanı kaldırmak, böylece HAYIR hala normal durumunda görünür.

bu birçok durumda yaparsanız, o bir animasyon başlar ortak bir üst sınıf yazmak kolaydır sınıfa animasyon temsilci ayarlar ve uygular + animationDidStop: animasyon o etkin w/tabakasını kaldırmak için. Bu, varsayılan uygulama ile mevcut olacağını umuyoruz CoreAnimation ateşi-ve-unutma niteliğini geri yükler.

+0

Ah, teşekkürler.Qt Jambi ile yazılımın tamamen farklı bir versiyonunu yazarken, bunu tekrar ihtiyacım olduğunda test edeceğim. ;) – Lemming

0

key@"onOrderOut" ile yönteminizin çağrıldığını ve yönteminizin doğru animasyonu döndürdüğünü doğruladınız mı?

+0

Evet. Asıl kodda ilk olarak NSLog'u eylemin adıyla çağırıyorum ve gerçekten de onOrderOut isteniyor. Animasyonun yaratıldığından ve döndüğünden de emin oldum, ancak yine de göz ardı ediliyor. – Lemming

İlgili konular