2012-07-24 5 views
6

jestem oddzielenie ekranu do małych płytek, następnie animować każdą płytkę do wykonania przejścia:Multiple CALayers Animacja - Tryb napełniania

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"]; 

    } 
} 

Problemem jest to, że tylko ostatni CALayer w łańcuchu pozostaje w pozycji końcowej. Próbowałem również ustawić CALayer ostatecznej transformacji wartość:

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

myślę, że mają do czynienia z kolejną tworząc instancję CALayer w pętli zresetować właściwości poprzedniej warstwy.

Ktoś ma sugestię, jak zaradzić tej sytuacji?

Odpowiedz

6

timeOffset nie jest właściwością, której chcesz użyć, która zmienia się w jakim momencie animacji się rozpocznie, a nie opóźnieniem, dopóki się nie zacznie. Zamiast tego należy ustawić beginTime animacji.

Pamiętaj, że czas rozpocząć powinny być CACurrentMediaTime() + yourDelay


Różnica między timeOffset i begintime można przedstawić następująco. Wiem, że widziałem wcześniej tę ilustrację, po prostu nie mogłem jej znaleźć.

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

Rzeczywiście !! To rozwiązuje to. Od teraz nie ma TimeOffset !! Wielkie dzięki! – Nimrod7

+2

beginTime powinien być CACurrentMediaTime() + yourDelay, chyba że animacja jest częścią grupy animacji. W takim przypadku wartość 0 przyjmuje wartość podstawową, zaczynając od początku nadrzędnej grupy animacji. –

+0

@DuncanC bardzo dobry punkt. –