let lay = CAReplicatorLayer()
lay.bounds = CGRect(x: 0, y: 0, width: 60, height: 60)
lay.position = view.center
lay.backgroundColor = UIColor.clear.cgColor
view.layer.addSublayer(lay)
let bar = CALayer()
bar.bounds = CGRect(x: 0, y: 0, width: 8.0, height: 40.0)
bar.position = CGPoint(x: 10, y: 75)
bar.cornerRadius = 2.0
bar.backgroundColor = UIColor.red.cgColor
lay.addSublayer(bar)
let move = CABasicAnimation(keyPath: "position.y")
move.toValue = bar.position.y - 35.0
move.duration = 0.5
move.autoreverses = true
move.repeatCount = Float.infinity
bar.add(move, forKey: nil)
lay.instanceCount = 3
lay.instanceDelay = 0.33
lay.masksToBounds = true
lay.instanceTransform = CATransform3DMakeTranslation(10.0, 0, 0)
以上是swift代码
CAReplicatorLayer * lay = [CAReplicatorLayer layer];
lay.bounds = CGRectMake(0, 0, 60, 60);
lay.position = self.view.center;
lay.backgroundColor = [UIColor clearColor].CGColor;
[self.view.layer addSublayer:lay];
CALayer * bar = [CALayer layer];
bar.bounds = CGRectMake(0, 0, 8, 40);
bar.position = CGPointMake(10, 75);
bar.cornerRadius = 2.0;
bar.backgroundColor = [UIColor redColor].CGColor;
[lay addSublayer:bar];
CABasicAnimation * move = [CABasicAnimation animationWithKeyPath:@"path"];
move.fromValue = @(10);
move.toValue = @(40);
move.delegate = self;
move.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, 0)];
move.toValue = [NSValue valueWithCGPoint:CGPointMake(0 ,40)];
move.duration = 0.5;
move.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
//自己返回
move.autoreverses = YES;
move.repeatCount = 100;
[bar addAnimation:move forKey:@"path"];
lay.instanceCount = 3;
lay.instanceDelay = 0.33;
lay.masksToBounds = YES;
lay.instanceTransform = CATransform3DMakeTranslation(10.0, 0, 0);
以上是oc代码