美文网首页
iOS核心动画-复制图层CAReplicatorlayer

iOS核心动画-复制图层CAReplicatorlayer

作者: ShIwEn9 | 来源:发表于2019-12-06 14:07 被阅读0次

当需要复制多个一样的视图的时候,就可以用到 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];
实现效果
简单的介绍就到这里。
一些复杂的动画效果请移步: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) ;
}

如有错误欢迎指正,谢谢。

相关文章

网友评论

      本文标题:iOS核心动画-复制图层CAReplicatorlayer

      本文链接:https://www.haomeiwen.com/subject/duvsgctx.html