当需要复制多个一样的视图的时候,就可以用到 CARelicatorLayer 了,如做加载动画一个一个的小点点,就可以使用CARelicatorLayer,当然得结合动画来实现。
打一个广告:本人目前离职状态(公司资金出现问题,原部门人员全体被迫离职。。。)如果有对我感兴趣的请给我留言或者简书私聊我,谢谢 !
CARelicatorLayer 继承自 CALayer 自然也就继承了 CALayer的属性和方法。并且拥有自己独有的属性:
/* 拷贝图层的次数,包括其所有的子图层,默认值是1,也就是没有任何子图层被复制 */
@property NSInteger instanceCount;
/*如果设置为YES,图层将保持于CATransformLayer类似的性质和相同的限制*/
@property BOOL preservesDepth;
/*在短时间内的复制延时,默认值为0,一般用在动画上(支持动画的延时操作) */
@property CFTimeInterval instanceDelay;
/*复制图层在被创建时产生的和上一个复制图层的位移(位移的锚点时CAReplicatorlayer的中心点)*/
@property CATransform3D instanceTransform;
/*设置多个复制图层的颜色,默认位白色 */
@property(nullable) CGColorRef instanceColor;
/*设置每个复制图层相对上一个复制图层的红色偏移量*/
@property float instanceRedOffset;
/*设置每个复制图层相对上一个复制图层的绿色偏移量*/
@property float instanceGreenOffset;
/*设置每个复制图层相对上一个复制图层的蓝色偏移量*/
@property float instanceBlueOffset;
/*设置每个复制图层相对上一个复制图层的透明度偏移量 一般是需要使用复制的 公式:(K -instanceAlphaOffset = 当前的透明度) */
@property float instanceAlphaOffset;
简单的例子:
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
imageView.image = [UIImage imageNamed:@"icon"];
CAReplicatorLayer *replLayer = [CAReplicatorLayer layer];
[replLayer addSublayer:imageView.layer];
replLayer.backgroundColor = UIColor.redColor.CGColor;
replLayer.frame = CGRectMake(0, 0, 100, 100);
replLayer.position = self.view.layer.position;
/// 设置复制次数
replLayer.instanceCount = 2;
CATransform3D transform = CATransform3DIdentity;
// 设置偏移量
CGFloat transFloat = replLayer.bounds.size.height;
// 偏移
transform = CATransform3DTranslate(transform, 0, transFloat, 0);
// 关于 x轴 旋转
transform = CATransform3DScale(transform, -1, -0.5, 0);
replLayer.instanceTransform = transform;
// 设置复制视图的透明图
replLayer.instanceAlphaOffset = - 0.7;
[self.view.layer addSublayer:replLayer];
![](https://img.haomeiwen.com/i12545710/faf809b1994ab26b.png)
简单的介绍就到这里。
一些复杂的动画效果请移步:CALayer-CAReplicatorLayer(复制图层)
案例:音乐震动条效果
- (void)viewDidLoad {
[super viewDidLoad];
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(20, 30, 350, 300)] ;
view.backgroundColor = [UIColor lightGrayColor] ;
[self.view addSubview:view] ;
//复制层(可以复制里面的子层)
CAReplicatorLayer *repL = [CAReplicatorLayer layer] ;
repL.frame = view.bounds ;
[view.layer addSublayer:repL] ;
CALayer *layer = [CALayer layer] ;
//计算震动条的位置,保证每一个的位置在父控件的底部
CGFloat X = 0 ;
CGFloat H = 150 ;
CGFloat W = 30 ;
CGFloat Y = view.bounds.size.height;
layer.bounds = CGRectMake(0, 0, W, H) ;
layer.anchorPoint = CGPointMake(0, 1) ;
layer.position = CGPointMake(X, Y);
layer.backgroundColor = [UIColor redColor].CGColor ;
[repL addSublayer:layer] ;
//添加动画
CABasicAnimation *anim = [CABasicAnimation animation] ;
anim.keyPath = @"transform.scale.y" ;
anim.toValue = @0 ;
anim.repeatCount = HUGE ;
anim.autoreverses = YES ;
anim.duration = 1.0 ;
[layer addAnimation:anim forKey:nil] ;
//要复制的份数(加上自己,包括自己)
repL.instanceCount = 5 ;
//动画延时执行时间
repL.instanceDelay = 1.0 ;
repL.instanceColor = [UIColor yellowColor].CGColor ;
//对复制出来的子层做形变操作(相对于s复制出来的上一个图层进行形变)
repL.instanceTransform = CATransform3DMakeTranslation(45, 0, 0) ;
}
-(void)layerAni{
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(20, 30, 350, 300)] ;
view.backgroundColor = [UIColor lightGrayColor] ;
[self.view addSubview:view] ;
//复制层(可以复制里面的子层)
CAReplicatorLayer *repL = [CAReplicatorLayer layer] ;
repL.frame = view.bounds ;
repL.backgroundColor = [UIColor blueColor].CGColor ;
[view.layer addSublayer:repL] ;
CALayer *layer = [CALayer layer] ;
//计算震动条的位置,保证每一个的位置在父控件的底部
layer.frame = CGRectMake(50, 50, 30, 30) ;
layer.backgroundColor = [UIColor redColor].CGColor ;
[repL addSublayer:layer] ;
CALayer *layer2 = [CALayer layer] ;
//计算震动条的位置,保证每一个的位置在父控件的底部
layer2.frame = CGRectMake(50, 150, 30, 30) ;
layer2.backgroundColor = [UIColor redColor].CGColor ;
[repL addSublayer:layer2] ;
//要复制的份数(加上自己,包括自己)
repL.instanceCount = 5 ;
//对复制出来的子层做形变操作(相对于s复制出来的上一个图层进行形变)
repL.instanceTransform = CATransform3DMakeTranslation(45, 0, 0) ;
}
![](https://img.haomeiwen.com/i12545710/5f4b8a377fb5ed58.png)
如有错误欢迎指正,谢谢。
网友评论