[CALayer animationForKey:]有多可靠?

时间:2011-11-09 22:06:21

标签: iphone core-animation calayer cakeyframeanimation

我有CALayer的子类MyLayer

@interface MyLayer : CALayer
@property (nonatomic,readonly) BOOL busy;
-(void)performTask1;
-(void)performTask2;
-(void)performTask3;
@end

performTask*函数中我说:

-(void)performTask*
{
    CAKeyframeAnimation *animation = [...];
    ...
    animation.removedOnCompletion = YES; // "YES" is default anyway
    ...
    [self addAnimation:animation
                forKey:TASK*_KEY];
}

busy属性适用于调用者,并按如下方式实现:

@dynamic busy;
-(BOOL)busy
{
        // i.e. for some specific ids
    return ([self animationForKey:TASK1_KEY] != nil ||
            [self animationForKey:TASK3_KEY] != nil);
}

我看到的是这种方法不可靠......我可以在屏幕上看到动画 已完成(没有动静等),而animationForKey:则没有返回nil。这种行为是半随机的......大多数情况下,它都符合预期。但有时需要1-2秒才能开始nil - s。

这种奇怪的行为消失,如果我将委托设置为动画animation.delegate = self 并实施 animationDidStop:finished:

有人经历过这个吗?

1 个答案:

答案 0 :(得分:0)

声明@dynamic会导致CALayer为您实施访问者方法(请参阅Properties on CALayer subclass aren't getting observed by CATransactionCALayer and CAAnimation's dynamic resolution of unimplemented property accessors)。因此,您可能只是看到混淆了哪个版本的“忙碌”被调用。为什么你首先声明“@dynamic”?

使用animationForKey可能会发生一些时髦的事情,但我会先尝试删除“@dynamic”。