2012-02-02 9 views
0

これは私をナットにしています。私は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の場合を除き、すべてが正常に動作します。理由を知らない。

+0

「サークル」のインスタンスをどのように作成していますか? –

+0

はい私はそれをやっています。 – Odrakir

+0

CALayerのinitではなく、+ layerメソッドをサブクラス化する必要があると思います。 –

答えて

1

設定した直後にmycolorの値を記録しようとしましたか?

あなたのコードは健全に見えるので、間違いなく奇妙なことが起こっています。どこかでmycolorのカスタムセッターやゲッタメソッドを作成し、それを適切に実装していない可能性はありますか?

私はあなたがARCを使用していると仮定します。私はセッターではなくmycolor ivarを直接設定しようとしましたか? (ARCに罰金されるべきであることを - それは漏れないだろうか、予期せず解除されます)initメソッドとdrawInContextで

+0

設定した後にmycolorを記録するとOKです。 drawInContextでのみ失敗します。 しかし、私はそれが常にnullではないことを知りました。アニメーションが終了し、再び開始される前に、フレームが1ミリ秒間カラーを点滅させて、色を記録します。 私の推測では、プレゼンテーションレイヤの代わりにモデルレイヤに色を設定しようとしているのですが、これはアニメーション化されたものですね。 – Odrakir

+0

このアプローチの代わりにCAShapeLayerを使用することを検討しましたか? CALayersを使用して色で塗りつぶしたアニメーションポリゴンを描画しようとしている場合、私はCAShapeLayerがすでにあなたのためにすべての作業を完了していると思います。 –

+0

あなたはCAShapeLayerのサブクラス化を意味しますか? – Odrakir

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

トライ利用_mycolor。

CGContextSetFillColorWithColor(ctx, self.mycolor.CGColor); 

drawInContextでは、プロパティの代わりにインスタンス変数を使用できます。

0

CALayerの正しいイニシャライザは+layerです。-initの代わりに+layerメソッドをオーバーライドする必要があります。これはまったく呼び出されないこともあります。