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 ...
随机推荐
- [ASP.NET 5]终于解决:Unable to load DLL 'api-ms-win-core-localization-obsolete-l1-2-0.dll'
11月12日,惊喜地发现SqlClient(System.Data.SqlClient.dll)跨平台了(对应的nuget包包是runtime.unix.System.Data.SqlClient), ...
- checking for fcc ....no checking for cc .. no
源码编译,提示缺少gcc cc cl.exe 解决方案: yum install -y gcc glibc
- 即使用ADO.NET,也要轻量级动态生成更新SQL,比Ormlite性能更高
先上测试结果: //测试1000次针对同一个表同一个字段更新,比Ormlite平均快2.34倍 //生成SQL+ExecuteNonQuery Ormlite 倍数 //6513ms 15158ms ...
- 第一篇puppet
1,什么是puppet puppet是一种Linux.Unix.windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件.用户.cron任务.软件包.系统服务等.puppe ...
- 线段树 poj 2991
我们只要把这些向量求和,最终所指的位置就是终点,因此我们只要维护好向量的区间和就可以了.对于第二个问题,我们可以用一个数组degree[i]表示第i个向量和第i-1一个向量当前的夹角,这样就有了当前的 ...
- Windows 新装进阶操作指南
Windows禁用CTRL+Space切换输入法 注册表打开HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys\00000010 把Key Mo ...
- asp.net MVC3的局部缓存页面PartialCache.cshtml
MVC3及以上有了PartialCache.cshtml局部缓存的方式,具体实现: 新建一个PartialCache.cshtml的页面,在控制器上写上如下代码: [OutputCache(Durat ...
- 零基础如何系统学习Java Web
零基础如何系统学习Java Web? 我来给你说一说 你要下决心,我要转行做开发,这样你才能学成. 你要会打字,我公司原来有一个程序员,打字都是两个手一指禅,身为程序员你一指禅怎么写出的代码,半个 ...
- Java编程中的美好
java程序员如何写出"优美"代码,动力节点告诉你怎么办: 1.注释尽可能全面 对于方法的注释应该包含详细的入参和结果说明,有异常抛出的情况也要详细叙述:类的注释应该包含类的功能说 ...
- TypedReference
http://stackoverflow.com/questions/4764573/why-is-typedreference-behind-the-scenes-its-so-fast-and-s ...