2012-07-24 59 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链保持在最终位置。 我也曾尝试设置CALayer的最终转换值:

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

我想这有创造循环的CALayer的另一个实例重置以前层的性质有关。

任何人有一个建议如何弥补这种情况?

回答

6

timeOffset是不是你想要使用的财产,是在什么时候进入动画将开始,而不是延迟,直到它开始实际上改变。相反,您应该设置动画的beginTime

记住,开始时间应该是CACurrentMediaTime() + yourDelay


timeOffset和BEGINTIME之间的差异可以这样来说明。我知道我以前看过这个插图,但我找不到它。

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

确实!!解决它。从现在开始没有TimeOffset!非常感谢! – Nimrod7 2012-07-24 07:15:13

+2

beginTime应该是CACurrentMediaTime()+ yourDelay,除非动画是动画组的一部分。在这种情况下,它从基本时间值开始使用0,从父动画组的开始处开始。 – 2013-02-28 22:12:56

+0

@DuncanC很好的一点。 – 2013-03-01 07:24:13