Это сводит меня с ума. Я пытаюсь изменить пользовательское свойство «mycolor» подкласса CALayer, это мой код:Цветная собственность в подклассе CALayer
#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 и одушевленные общественные методы. Анимация вызывается каждую секунду и меняет цвет каждый раз, когда пользователь набирает круг.
Все работает отлично, за исключением того, что в «drawInContext» mycolor всегда имеет значение null. Не знаю, почему.
Как вы создаете экземпляры 'Circle'? –
Да, я это делаю. – Odrakir
Я считаю, что вы должны подклассифицировать метод + layer, а не init для CALayer. –