CoreAnimation 之CAReplicatorLayer
CAReplicatorLayer:
主要作用有以下两个:
- CAReplicatorLayer的目的是为了高效生成许多相似的图层,它会绘制一个或多个图层的子图层 并在每个复制体上应用不同的变换
- 使用CAReplicatorLayer的其中一个实际应用:反射 使用CAReplicatorLayer并应用一个负比例变换于一个复制图层 你就可以创建指定视图内容的镜像图片 这样就创建了一个实时的反射效果
首先看第一个的代码示例:
/* 创建一个模板层 CAReplicatorLayer会按照一定的规则“克隆”这个模板 */
CAShapeLayer *shape = [CAShapeLayer layer];
shape.frame = CGRectMake(, , , );
/* 绘制模板的形状 */
shape.path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(, , , )].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 = ; /* 给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 = ;
    layer.anchorPoint = CGPointMake(0.5, 0.5);
    /*        创建3D转换效果         */
    CATransform3D transform = CATransform3DIdentity;
    CGFloat verticaloffset = self.bounds.size.height  ;
    transform = CATransform3DTranslate(transform, , verticaloffset, );
    /*        设置Y轴镜面反射         */
    transform = CATransform3DScale(transform, , -, );
    transform = CATransform3DRotate(transform, -M_PI / , , , );
    layer.instanceTransform  = transform;
    /*        镜面的透明度 越低显示越清晰 因为是镜面效果         */
    layer.instanceAlphaOffset = -0.1;
}
效果图如下

CoreAnimation 之CAReplicatorLayer的更多相关文章
- CoreAnimation笔记
		核心动画继承结构 CoreAnimation Core Animation是直接作用在CALayer上的(并非UIView上)非常强大的跨Mac OS X和iOS平台的动画处理API,Core Ani ... 
- iOS开发CoreAnimation解读之三——几种常用Layer的使用解析
		iOS开发CoreAnimation解读之三——几种常用Layer的使用解析 一.CAEmitterLayer 二.CAGradientLayer 三.CAReplicatorLayer 四.CASh ... 
- iOS开发CoreAnimation解读之二——对CALayer的分析
		iOS开发CoreAnimation解读之二——对CALayer的分析 一.UIView中的CALayer属性 1.Layer专门负责view的视图渲染 2.自定义view默认layer属性的类 二. ... 
- iOS CoreAnimation详解(一) 有关Layer的动画
		以前由于项目需要 也写了一些动画 ,但是知识不系统,很散.这段时间趁着项目完成的空袭,来跟着大神的脚步系统的总结一下iOS中Core Animation的知识点. 原博客地址:http://blog. ... 
- 利用CAReplicatorLayer实现的加载动画
		在上一篇中,笔者简要介绍了CAReplicatorLayer,在本篇中,将介绍具体的实用价值. 实用CAReplicatorLayer作为核心技术实现加载动画. 首先,创建一个UIView的子类 @i ... 
- CoreAnimation 之CATextLayer
		如果你想在一个图层中显示文字,完全可以借助图层代理直接将Core Graphics写入图层的内容(这就是UILabel的精髓).如果雨果寄宿于图层的视图,直接在图层上操作,其实相当繁琐.你要为每一个显 ... 
- 二、CoreAnimation之寄宿图详解
		在之前的图层树中我们知道,可以使用CALayer对象创建一些有背景颜色的图层,其实使用CALayer,不仅可以利用其展示背景颜色,还可以展示图片.而这些展示内容,其实就是CALayer的寄宿图.这一节 ... 
- 一、CoreAnimation之图层树详解
		CoreAnimation :在字面意思为“核心动画”,但是如果您认为它仅仅是一个动画框架,那可能就要错过一些经典功能了.动画,只是CoreAnimation功能的一小部分,毕竟人家的源头是一个叫做L ... 
- iOS CoreAnimation 核心动画
		一 介绍 一组非常强大的动画处理API 直接作用在CALAyer上,并非UIView(UIView动画) CoreAnimation是所有动画的父类,但是不能直接使用,应该使用其子类 属性: dura ... 
随机推荐
- Linux 下配置php开发环境
			windows下有一键安装的环境很方便,不过现实中常常服务器是linux系统.想要搭建环境怎么搞呢? 边学变发直播博客,不定期更新. 
- 软件工程(FZU2015)赛季得分榜,第二回合
			目录 第一回合 第二回合 第三回合 第四回合 第五回合 第6回合 第7回合 第8回合 第9回合 第10回合 第11回合 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分 ... 
- Django-跨站请求
			//用户验证Tonken 在Html 中 设置一个Token {% csrf_token %} //在代码Views.py 中返回值添加 context_instance=RequestContext ... 
- java/python中的队列
			Queue<TreeNode> que=new LinkedList<>(); 用linkedlist实现队列,offer,poll进出队列,peek对列顶部元素 python ... 
- 关于jsp页面将表单填入数据库出现中文乱码绝对解决方案
			在所有jsp页面中添加两句话1.<%@ page language="java" contentType="text/html; charset=utf-8&quo ... 
- 解决:Win 10安装软件时提示:文件系统错误 (-1073740940)
			1.win+R输入 gpedit.msc 2.左边计算机配置 windows设置——安全设置——本地策略——安全选项 3.在安全选项右边选择 用户账户控制:管理员批准模式中管理员的提升权限提示的行为, ... 
- Redis java操作客户端
			Jedis常用操作 1.测试连通性 Jedis jedis = new Jedis("192.168.1.201",6380,10000); System.out.println( ... 
- bzoj4282慎二的随机数列
			海带头又上线了QwQ~ 这是一个奇怪的lis问题 显然一定存在一种最优答案使所有辨认不清的数都在答案中. [为什么呢]因为你完全可以用一个'N'来替换一个'K'啊QwQ~ 那么在选完所有'N'之后,一 ... 
- Java实现的二分查找算法
			二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点 ... 
- 机器学习笔记—svm算法(上)
			本文申明:本文原创,如转载请注明原文出处. 引言:上一篇我们讲到了logistic回归,今天我们来说一说与其很相似的svm算法,当然问题的讨论还是在线性可分的基础下讨论的. 很多人说svm是目前最好的 ... 
