これは私をナットにしています。私はCALayerのサブクラスのカスタムプロパティ「mycolor」に変更しようとしている、これは私のコードです: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とアニメーションはpublicメソッドです。ユーザーが円をタップするたびにAnimateが毎秒呼び出され、changeColorが呼び出されます。
「drawInContext」でmycolorが常にnullの場合を除き、すべてが正常に動作します。理由を知らない。
「サークル」のインスタンスをどのように作成していますか? –
はい私はそれをやっています。 – Odrakir
CALayerのinitではなく、+ layerメソッドをサブクラス化する必要があると思います。 –