2011-11-09 8 views
0

私はMyLayerと呼ばれるCALayerのサブクラスがあります:busyプロパティは、発信者のためのものであり、このように実装[CALayer animationForKey:]の信頼性はどれですか?

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

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

私が言う

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

performTask*で機能を私が見ているのは、このアプローチが信頼できないということです...私は画面上で見ることができます帽子のアニメーションです(何も動かないなど)。animationForKey:nilを返しません。振る舞いはセミランダムです...ほとんどの場合、期待通りに動きます。しかし、時々、私がnil-sを得るのが始まるまでに1〜2秒かかります。私はanimation.delegate = selfをアニメーションとanimationDidStop:finished:を実装するために、デリゲートを設定した場合

この奇妙な行動は、消えます。

誰かもこれを経験しましたか?

+0

メインスレッドのanimationForKeyで確認していますか? –

+0

はい、メインGUIスレッドのすべて... – debleek63

+0

私は同じ振る舞いを見ています。あなたと同じように、デリゲートと 'animationDidStop:finished:'メソッドを追加すると、期待通りの動作が得られます。コアアニメーションのバグ?その他のソリューション? –

答えて

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"を削除しようと思います。

関連する問題