博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CoreAnimation 之CAReplicatorLayer
阅读量:6882 次
发布时间:2019-06-27

本文共 2653 字,大约阅读时间需要 8 分钟。

CAReplicatorLayer:

主要作用有以下两个:

  •  CAReplicatorLayer的目的是为了高效生成许多相似的图层,它会绘制一个或多个图层的子图层 并在每个复制体上应用不同的变换
  •  使用CAReplicatorLayer的其中一个实际应用:反射 使用CAReplicatorLayer并应用一个负比例变换于一个复制图层 你就可以创建指定视图内容的镜像图片 这样就创建了一个实时的反射效果

首先看第一个的代码示例:

/*        创建一个模板层 CAReplicatorLayer会按照一定的规则“克隆”这个模板         */    CAShapeLayer *shape = [CAShapeLayer layer];    shape.frame = CGRectMake(0, 0, 80, 80);    /*        绘制模板的形状         */    shape.path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 80, 80)].CGPath;    /*        模板的填充颜色         */    shape.fillColor = [UIColor redColor].CGColor;    shape.opacity = 0.0;    /*        创建所有的子层的动画组(也可以是单个动画)         */    CAAnimationGroup *animationGroup = [CAAnimationGroup animation];    /*        动画组元素         */    animationGroup.animations = @[[self alphaAnimation],[self scaleAnimation]];    /*        动画执行时间         */    animationGroup.duration = 4.0;    animationGroup.autoreverses = NO;    animationGroup.repeatCount = HUGE;    /*        给模板层添加动画 实质上也是给每个CAReplicatorLayer子层添加动画         */    [shape addAnimation:animationGroup forKey:@"animationGroup"];    /*        创建CAReplicatorLayer对象         */    CAReplicatorLayer *replicatorLayer = [CAReplicatorLayer layer];    replicatorLayer.frame = self.containerView.bounds;    /*        设置每个元素的添加间隔时间         */    replicatorLayer.instanceDelay = 0.5;    /*        设置每元素个数         */    replicatorLayer.instanceCount = 8;   /*        给CAReplicatorLayer对象的子层添加转换规则 这里决定了子层的布局         */
    replicatorLayerY.instanceTransform = CATransform3DTranslate(CATransform3DIdentity, 0, radius+between, 0);
 

 

/*        添加子层         */
[replicatorLayer addSublayer:shape];

在这里,大家可以根据需要添加不同的动画元素或者不添加任何动画,该用法多用于实现加载提示视图的动画制作。

第二个用法,实现某个视图的反射效果:

  我们首先继承UIView创建一个子类,在子类的+(Class)layerClass方法中设置当前视图对象的layer为CAReplicatorLayer对象:

+(Class)layerClass{    return [CAReplicatorLayer class];}

 

然后在创建该子类的对象时对self.layer进行设置相关参数:

- (void)setup{    /*        获取当前的layer 实际上为CAReplicatorLayer对象         */    CAReplicatorLayer *layer = (CAReplicatorLayer *)self.layer;    layer.instanceCount = 2;    layer.anchorPoint = CGPointMake(0.5, 0.5);        /*        创建3D转换效果         */    CATransform3D transform = CATransform3DIdentity;    CGFloat verticaloffset = self.bounds.size.height  ;    transform = CATransform3DTranslate(transform, 0, verticaloffset, 0);        /*        设置Y轴镜面反射         */    transform = CATransform3DScale(transform, 1, -1, 0);    transform = CATransform3DRotate(transform, -M_PI / 4, 1, 0, 0);    layer.instanceTransform  = transform;    /*        镜面的透明度 越低显示越清晰 因为是镜面效果         */    layer.instanceAlphaOffset = -0.1;}

 效果图如下

 

转载于:https://www.cnblogs.com/ToBeTheOne/p/5754523.html

你可能感兴趣的文章
HTML5 入门基础
查看>>
【转载】读懂IL代码就这么简单(二)
查看>>
C++文件操作(fstream)
查看>>
用main函数传参做简单的计算器的代码
查看>>
python中struct.unpack的用法
查看>>
体绘制(Volume Rendering)概述之4:光线投射算法(Ray Casting)实现流程和代码(基于CPU的实现)...
查看>>
Python实践之(七)逻辑回归(Logistic Regression)
查看>>
PAT (Advanced Level) 1107. Social Clusters (30)
查看>>
oracle数据库存储过程中NO_DATA_FOUND不起作用解决
查看>>
软件缺陷分析-软件测试之犯罪心理学
查看>>
Python实战之自己主动化评论
查看>>
spring boot下使用logback或log4j生成符合Logstash标准的JSON格式
查看>>
iOS面试题合集(77道)
查看>>
hadoop安装及配置入门篇
查看>>
[原] KVM 虚拟化原理探究(2)— QEMU启动过程
查看>>
使用Java程序调用MatLab
查看>>
什么是C++虚函数、虚函数的作用和使用方法
查看>>
Atitit.cto 与技术总监的区别
查看>>
关于【自证清白】
查看>>
手把手教你crontab排障
查看>>