Ö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?
Sorunu çözmekte haklısınız! Çok teşekkürler :) – romrom
Rica ederim! – Costique
Bu gerçekten yararlıdır. Beni bir gün kurtardı. – feihu