2012-01-17 12 views
1

下のコードはCALayerのサブクラスです。 animateValに電話すると、drawInContextがアニメーション化されます。それは素晴らしいことです。次のコアアニメーション暗黙アニメーションが機能しないのはなぜですか?

actionForKeyで暗黙のアニメーションに変換しようとしました。 valプロパティ(layer.val = 10)に値を割り当てると、すぐにvalが変更され、valという同じ値でdrawInContextが繰り返し呼び出されます。

私は間違っていますか?

@interface MyLayer : CALayer 
@property (nonatomic, assign) CGFloat val; 
- (void)animateVal:(CGFloat)val; 
@end 

@implementation MyLayer 
@dynamic val; 

+ (BOOL)needsDisplayForKey:(NSString *)key { 
    return [key isEqualToString:@"val"] || [super needsDisplayForKey:key]; 
} 

- (id<CAAction>)actionForKey:(NSString *)event { 
    if ([event isEqualToString:@"val"]) { 
     CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"val"]; 
     anim.duration = 3.0; 
     return anim; 
    } 

    return [super actionForKey:event]; 
} 

- (void)animateVal:(CGFloat)val { 
    CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"val"]; 
    anim.toValue = [NSNumber numberWithFloat:val]; 
    anim.duration = 3.0; 
    [self addAnimation:anim forKey:nil]; 
} 

- (void)drawInContext:(CGContextRef)ctx { 

    CGContextAddRect(ctx, CGRectMake(10, 10, self.val, self.val)); 
    CGContextSetFillColorWithColor(ctx, [UIColor greenColor].CGColor); 
    CGContextFillPath(ctx); 
} 

@end 

答えて

1

解決策は、アクションを返すときに値からを設定することです。

anim.fromValue = [[self presentationLayer] valueForKey:event]; 
関連する問題