0

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。動作は半ランダムです...ほとんどの場合、期待どおりに動作します。nilただし、 -sが表示されるまでに 1 ~ 2 秒かかることがあります。

デリゲートをアニメーションに設定して実装すると、この奇妙な動作は消えます。animation.delegate = self animationDidStop:finished:

これも経験した人いますか?

4

1 に答える 1

0

@dynamic を宣言すると、CALayer によってアクセサー メソッドが実装されます (「CALayer サブクラスのプロパティが CATransactionCALayer によって監視されない」および「未実装のプロパティ アクセサーの CAAnimation の動的解決」を参照)。そのため、どのバージョンの "busy" が呼び出されているのか混乱している可能性があります。そもそもなぜ「@dynamic」を宣言したのですか?

animationForKey で奇妙なことが起こっている可能性もありますが、最初に「@dynamic」を削除してみます。

于 2012-03-20T07:58:27.597 に答える