CALayer子类中的颜色属性

这使我疯狂。 我试图改变一个CALayer子类的自定义属性“mycolor”,这是我的代码:

#import "Circle" @interface Circle() @property (nonatomic, strong) UIColor * mycolor; @property (nonatomic) float initial_angle; @property (nonatomic) float end_angle; @end @implementation Circle @synthesize mycolor; @synthesize initial_angle, end_angle; - (id) init { self = [super init]; if (self) { CGFloat red = (CGFloat)random()/(CGFloat)RAND_MAX; CGFloat blue = (CGFloat)random()/(CGFloat)RAND_MAX; CGFloat green = (CGFloat)random()/(CGFloat)RAND_MAX; self.mycolor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0]; self.backgroundColor = [UIColor clearColor].CGColor; } return self; } -(void) changeColor { CGFloat red = (CGFloat)random()/(CGFloat)RAND_MAX; CGFloat blue = (CGFloat)random()/(CGFloat)RAND_MAX; CGFloat green = (CGFloat)random()/(CGFloat)RAND_MAX; self.mycolor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0]; } - (void) animate { float final = arc4random() % 360; float afrom = self.initial_angle; self.initial_angle = final; CABasicAnimation * anim = [CABasicAnimation animationWithKeyPath:@"initial_angle"]; anim.fromValue = [NSNumber numberWithFloat:afrom]; anim.toValue = [NSNumber numberWithFloat:final]; anim.duration = 5; anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; [self addAnimation:anim forKey:@"initial_angle"]; final = arc4random() % 360; afrom = self.end_angle; self.end_angle = final; anim = [CABasicAnimation animationWithKeyPath:@"end_angle"]; anim.fromValue = [NSNumber numberWithFloat:afrom]; anim.toValue = [NSNumber numberWithFloat:final]; anim.duration = 5; anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; [self addAnimation:anim forKey:@"end_angle"]; } - (void) drawInContext:(CGContextRef)ctx { CGContextMoveToPoint(ctx, 50, 50); CGContextAddArc(ctx, 50, 50, 50, initial_angle*M_PI/180, end_angle*M_PI/180, 0); CGContextClosePath(ctx); NSLog(@"%@", self.mycolor); CGContextSetFillColorWithColor(ctx, self.mycolor.CGColor); CGContextFillPath(ctx); } + (BOOL)needsDisplayForKey:(NSString*)key { if ([key isEqualToString:@"initial_angle"]|| [key isEqualToString:@"end_angle"]|| [key isEqualToString:@"mycolor"]) { return YES; } else { return [super needsDisplayForKey:key]; } } @end 

changeColor和animate是公共方法。 Animate每秒钟都会被调用,每次用户点击圆时都会改变颜色。

一切正常,但在“drawInContext”mycolor始终为空。 不知道为什么。

您是否尝试过在设置后立即loggingmycolor的值?

你的代码看起来很合理,所以肯定有些奇怪的事情发生。 有没有可能你已经创build了mycolor的自定义setter或getter方法,并没有正确实施它?

我假设你正在使用ARC – 你有没有尝试直接设置mycolor伊娃而不是通过setter? (在ARC应该是好的 – 它不会泄漏或意外释放)

 @synthesize mycolor = _mycolor; _mycolor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0]; 

尝试在init方法和drawInContext中使用_mycolor。

  CGContextSetFillColorWithColor(ctx, self.mycolor.CGColor); 

我想在drawInContext中,你可以使用实例variables,而不是属性。

CALayer的正确初始值设定项是+layer ,您应该覆盖+layer方法而不是-init ,甚至可能根本不会调用。