CAReplicatorLayer是一个容器层,添加到 容器上的 layer 可以复制 若干份。可以预先设定复制多少份、设定副本之间的距离,透明度或颜色。然后添加动画,形成比较炫的加载动画。需要设置三个元素,CAReplicatorLayer ,CALayer和CABasicAnimation;
1.初始化CAReplicatorLayer
_replicatorLayer = [[CAReplicatorLayer alloc] init];
_replicatorLayer.frame = CGRectMake(50, 100, 200, 200);
_replicatorLayer.backgroundColor = [UIColor lightGrayColor].CGColor;
[self.view.layer addSublayer:_replicatorLayer];
2.初始化CALayer
_layer = [[CALayer alloc] init];
_layer.bounds = CGRectMake(0, 0, 14, 14);
_layer.position = CGPointMake(100, 40);
_layer.backgroundColor = [UIColor whiteColor].CGColor;
_layer.borderColor = [UIColor redColor].CGColor;
_layer.borderWidth = 0.5;
3.添加到CAReplicatorLayer上
// 只有 加在 replicator layer 上的 layer 可以复制
[_replicatorLayer addSublayer:_layer];
4.设置重复次数 以及初始化复制的layer的样式
//设置重复次数以及初始位置
NSInteger number = 10;//复制的个数
CGFloat angle = 2.0*M_PI /number;
_replicatorLayer.instanceCount = number;
_replicatorLayer.instanceTransform = CATransform3DMakeRotation(angle, 0, 0, 1);
5.开始动画。可以写一个按钮的事件
CABasicAnimation * basicAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
basicAnimation.fromValue = @(1.0);
basicAnimation.toValue = @(0.1);
basicAnimation.duration = 0.8;
basicAnimation.repeatCount = INFINITY;
[_layer addAnimation:basicAnimation forKey:nil];
// 注释掉所有layer将同时运动
_replicatorLayer.instanceDelay = 0.8 / 10;
//修复第一次动画的bug
_layer.transform = CATransform3DMakeTranslation(0.03, 0.03, 0.03);