2012-07-24 2 views
6

を入力します。複数のCALayersアニメーション - 私はトランジションを実行するために、各タイルをアニメーション、その後、小さなタイルに画面を分割していますモード

for (int x=0; x<number_of_x_splits; x++) { 

    for (int y=0; y<number_of_y_splits; y++) { 

     CGSize splitSize = CGSizeMake(screenBounds.width/number_of_x_splits, screenBounds.height/number_of_y_splits); 

     CATransformLayer *transformLayer = [CATransformLayer layer]; 
     [transformLayer setFrame:CGRectMake(splitSize.width * x, splitSize.height * y, splitSize.width, splitSize.height)]; 
     [transformLayer setPosition:CGPointMake((splitSize.width * x) + splitSize.width/2, (splitSize.height * y) + splitSize.height/2)]; 

     ... adding some sublayers to transformLayer... 

     CABasicAnimation *rotate = [CABasicAnimation animationWithKeyPath:@"transform.rotation.y"]; 
     [rotate setDuration:5.0]; 
     [rotate setFromValue:[NSNumber numberWithFloat:0]]; 
     [rotate setToValue:[NSNumber numberWithFloat:M_PI]]; 
     [rotate setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
     [rotate setTimeOffset:(1/(number_of_x_splits + number_of_y_splits)) * (x+y)]; 
     [rotate setFillMode:kCAFillModeForwards]; 
     [rotate setRemovedOnCompletion:NO]; 
     [transformLayer addAnimation:rotate forKey:@"transform.rotation.y"]; 

    } 
} 

問題は、チェーンの最後のCALayerは、最終的な位置に留まることです。 Iはまた、CALayerの最終的な変換値を設定しようとした:

[transformLayer setTransform:CATransform3DMakeRotation(M_PI, 0, 1, 0)]; 

私はそれが前の層のプロパティをリセットループ内のCALayerの別のインスタンスを作成するとしなければならないと思います。

誰かが状況を改善する方法を提案していますか?

答えて

6

timeOffsetは使用したいプロパティではありませんが、実際に開始するアニメーションのポイントと開始するまでの遅延は異なります。代わりに、アニメーションのbeginTimeを設定する必要があります。

開始時間がCACurrentMediaTime() + yourDelay


TIMEOFFSETと開始時間の違いでなければならないことに注意してくださいは、次のように説明することができます。私は前にこのイラストを見たことが分かっています、私はそれを見つけることができませんでした。

Normal animation | 12345678 | 
Begin time   |  12345678 | 
Time offset   | 5678  | 
+0

それはそれを解決する。今からTimeOffsetはありません!!どうもありがとう! – Nimrod7

+2

アニメーションがアニメーショングループの一部でない限り、beginTimeはCACurrentMediaTime()+ yourDelayにする必要があります。その場合、親アニメーショングループの先頭から開始して、ベースタイム値として0が使用されます。 –

+0

@DuncanCとても良い点があります。 –

関連する問題