我有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:
。
有人经历过这个吗?
答案 0 :(得分:0)
声明@dynamic会导致CALayer为您实施访问者方法(请参阅Properties on CALayer subclass aren't getting observed by CATransaction和CALayer and CAAnimation's dynamic resolution of unimplemented property accessors)。因此,您可能只是看到混淆了哪个版本的“忙碌”被调用。为什么你首先声明“@dynamic”?
使用animationForKey可能会发生一些时髦的事情,但我会先尝试删除“@dynamic”。