2010-10-25 6 views
13

Özel özellikler (yarıçap ve renk tonu) içeren özel bir CALayer (CircleLayer demek) var. Katman drawInContext: yönteminde kendini gösterir.Özel CALayer özelliklerinin canlandırılması, animasyon sırasında diğer özelliklerin sıfırlanmasına neden neden oluyor?

- (void)drawInContext:(CGContextRef)ctx { 
    NSLog(@"Drawing layer, tint is %@, radius is %@", self.tint, self.radius); 

    CGPoint centerPoint = CGPointMake(CGRectGetWidth(self.bounds)/2, CGRectGetHeight(self.bounds)/2); 

    CGContextMoveToPoint(ctx, centerPoint.x, centerPoint.y); 
    CGContextAddArc(ctx, centerPoint.x, centerPoint.y, [self.radius doubleValue], radians(0), radians(360), 0); 
    CGContextClosePath(ctx); 

    /* Filling it */ 
    CGContextSetFillColorWithColor(ctx, self.tint.CGColor); 
    CGContextFillPath(ctx); 
} 

Ben yarıçapı canlandırılabilir olmak istiyorum bu yüzden

+ (BOOL)needsDisplayForKey:(NSString *)key { 
    if ([key isEqualToString:@"radius"]) { 
     return YES; 
    } 
    return [super needsDisplayForKey:key]; 
} 

uyguladık Ve animasyon şöyle gerçekleştirilir:

CABasicAnimation *theAnimation=[CABasicAnimation animationWithKeyPath:@"radius"]; 
theAnimation.duration=2.0; 
theAnimation.fromValue=[NSNumber numberWithDouble:100.0]; 
theAnimation.toValue=[NSNumber numberWithDouble:50.0]; 
theAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 

[circleLayer addAnimation:theAnimation forKey:@"animateRadius"]; 

circleLayer.radius = [NSNumber numberWithDouble:50.0]; 

drawInContext: animasyon sırasında beklendiği gibi çağrılan daireyi yeniden çizmek için, animasyon başlar başlamaz animasyon başlar ve animasyon bittiğinde orijinal değerine döner.

Özel bir mülkün animasyonunu yapmak ve animasyon sırasında diğer özelliklerin değerlerini korumak istiyorsanız, onları da canlandırmak zorunda olduğumu anladım.

Amaç bir daireyi büyütmek/küçültmek değil, bunun için dönüşümü kullanabileceğimi biliyorum. Sadece basit bir örnekle, tüm diğerlerini canlandırmak zorunda kalmadan tek bir özel mülkiyeti canlandırma problemini açıklamaktır.

Burada bulabilirsiniz sorunu gösteren basit bir proje yaptık: Sample project illustrating the issue

muhtemelen CoreAnimation nasıl çalıştığı hakkında alamadım şey var, ben yoğun arama gerçekleştirdiğiniz ama ben Hiçbir ipucu ile sıkışmış m. Herkes biliyor mu?

cevap

24

Sorunuzu doğru bir şekilde anladım, bu şekilde gider. Bir CALayer'a bir animasyon eklediğinizde, initWithLayer:'u kullanarak o katmanın sözde katmanı oluşturur. Sunu katmanı her animasyon karesi için gerçek animasyonlu durumu içerirken, orijinal katman son halini alır. Kendi özelliklerinizi canlandırmanın problemi, CALayer'in hepsini initWithLayer:'da kopyalamamasıdır. Bu durumda, initWithLayer:'u geçersiz kılmalı ve animasyon için ihtiyacınız olan tüm özellikleri, yani hem ton hem de yarıçapı ayarlamalısınız.

+1

Sorunu çözmekte haklısınız! Çok teşekkürler :) – romrom

+0

Rica ederim! – Costique

+0

Bu gerçekten yararlıdır. Beni bir gün kurtardı. – feihu

0
+ (BOOL)needsDisplayForKey:(NSString *)key { 
    if ([key isEqualToString:@"radius"] || [key isEqualToString:@"tint"]) { 
     return YES; 
    } 
    return [super needsDisplayForKey:key]; 
} 

Animasyon, içeriğin tüm özelliklerinin bir yenilemeye yanıt vermesini gerektirebilir.

+0

Bunu zaten denedim ve hiçbir etkisi yok. – romrom

İlgili konular