多个CALayers动画 - 填充模式

Nim*_*od7 6 core-animation objective-c

我将屏幕分成小块,然后设置每个块的动画以执行转换:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

问题是只有链中的最后一个CALayer保持在最终位置.我还尝试设置CALayer最终变换值:

[transformLayer setTransform:CATransform3DMakeRotation(M_PI, 0, 1, 0)];
Run Code Online (Sandbox Code Playgroud)

我想这与在循环中创建另一个CALayer实例有关,重置前一层的属性.

有人建议如何纠正这种情况?

Dav*_*ist 6

timeOffset不是你想要使用的属性,它实际上会改变它将开始的动画的哪一点,而不是它开始之前的延迟.相反,你应该设置beginTime动画.

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


timeOffset和beginTime之间的区别可以这样说明.我知道我以前见过这个插图,我找不到它.

Normal animation    | 12345678 |
Begin time          |     12345678 |
Time offset         | 5678     |
Run Code Online (Sandbox Code Playgroud)

  • beginTime应为CACurrentMediaTime()+ yourDelay,除非动画是动画组的一部分.在这种情况下,它使用0作为基本时间值,从父动画组的开头开始. (2认同)