0

複数の CALayer を同時にアニメーション化する際にいくつかの問題に遭遇しており、誰かが私を正しい方向に向けてくれることを望んでいました。

私のアプリには CALayer の配列が含まれています。各レイヤーの位置は に設定されて(previousLayer.position.y + previousLayer.bounds.height)おり、基本的にはテーブルのように配置されています。次に、呼び出されるたびに新しいレイヤーをスタックに追加し、その Y 位置を 0 に設定するメソッドがあります。配列内の他のすべてのレイヤーの Y 位置は、新しいレイヤーの高さだけオフセットされます。層 (基本的にすべての古い層を押し下げます)。

私が問題を抱えているのは、前のアニメーションが完了するまで新しいレイヤーを追加できないことです。暗黙のアニメーションがいつ終了したかを知る方法はありますか? あるいは、CABasicAnimationandを使用する場合、が呼び出されanimationDidFinishたときにどのオブジェクトがアニメーションを終了したかを知る方法はありますか?animationDidFinish

4

3 に答える 3

4

アニメーション オブジェクトのキーに任意の値を設定できます。これが意味することは、アニメーション化するレイヤーをアニメーションに関連付けてから、 -animationDidStop:finished: でクエリを実行できるということです。アニメーションは次の方法で作成します。

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"];
// set other fields...

[anim setValue:layerToAnimate forKey:@"layer"];

// Start the animation
[layerToAnimate addAnimation:anim forKey:nil];

次に、アニメーションが停止したときにその値を確認します。

- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)flag
{
    CALayer *animatedLayer = [animation valueForKey:@"layer"];
    // do something with the layer based on some condition...
    // spin off the next animation...

    [CATransaction begin];
    [CATransaction setValue:(id)kCFBooleanTrue
                 forKey:kCATransactionDisableActions];
    [animatedLayer setPosition:position];
    [CATransaction commit];
}

これは明示的なアニメーションですが、必要なものが得られるはずです。

于 2010-06-15T18:03:34.330 に答える
0

CABasicAnimationをCALayerに直接追加するのではなく、レイヤーの「actions」ディクショナリに追加する必要がありました...これにより、アニメーションが終了した後、レイヤーは最終位置に残りますが、「animationDidFinish」メソッドが呼び出されます。 。

-(void)startAnimation {
    if(!animating){
        animating = YES;
        for(int i=0; i<[tweets count]; i++) {
            //get the layer
            CETweetLayer *currentLayer = [tweets objectAtIndex:i];

            //setup the orgin and target y coordinates
            float targetY = currentLayer.position.y + offset;

        //setup the animation
        CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"];
        anim.delegate = self;
        currentLayer.actions = [NSDictionary dictionaryWithObject:anim forKey:@"position"];
        currentLayer.position = CGPointMake(self.bounds.size.width/2, targetY);
     }
    }
}

その後...

-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
    animating = NO; 
}
于 2010-06-26T19:49:19.963 に答える