4

これはおもしろい…こうすることで

CABasicAnimation* a = [CABasicAnimation animationWithKeyPath:@"opacity"];
    a.fromValue = [NSNumber numberWithFloat:0.];
    a.toValue = [NSNumber numberWithFloat:1.];
    a.duration = .4;
    a.fillMode = kCAFillModeBoth;
    a.removedOnCompletion = NO;

CGFloat timeOffset = 0;
for(CALayer* layer in layers)
{
    a.beginTime = [someCommonSuperView.layer convertTime:CACurrentMediaTime()fromLayer:nil] + timeOffset;
    [layer addAnimation:a forKey:nil];
    timeOffset += .4;
}

私は実際には常に同じCABasicAnimationのbeginTimeを変更し、その参照カウントを増やしています。一連のレイヤーが次々にフェードインするのではなく、すべてのレイヤーの開始時刻を台無しにして、最後のレイヤーの時点ですべてのレイヤーが一度に表示されるようにする必要があります。しかし、上記のコードは、レイヤーが順番にフェードインするという点で実際に機能しているようです。

では、このようにアニメーションを再利用することは理にかなっていますか?パスごとに新しいインスタンスを作成しないようにするには?

addAnimationは、参照数を増やすのではなく、実際にアニメーションのディープコピーを作成していますか?

4

1 に答える 1

8

ドキュメントによると:

- (void)addAnimation:(CAAnimation *)anim forKey:(NSString *)key

指定されたキーのレシーバーのレンダリングツリーにアニメーションオブジェクトを追加します。

パラメータanim

レンダリングツリーに追加されるアニメーション。オブジェクトは、参照されるのではなく、レンダリングツリーによってコピーされることに注意してください。オブジェクトに対するその後の変更は、レンダリングツリーに伝播されません。

CAAnimationしたがって、同じオブジェクトを再利用しても安全だと思います。

于 2012-04-24T01:10:54.297 に答える