iOS quartzCore第六章—— CAReplicatorLayer的运用



CAReplicatorLayer可以复制自己子层的layer,并且复制的出来的layer和原来的子layer拥有相同的动效。然后通过设置一些属性,就可以完成很酷的效果,非常强大。。

效果



love_music.gif

Demo



建议先下载demo,再结合下面的分析,会好理解点。地址https://github.com/Resory/RYReplicatorLayer

逻辑


  • 本文主要讲述love动效的制作。music动效可参照love动效注释。
  • 首先我们要得到一个love路径,这个路径用UIBezierPath来制作。
  • 然后生成一个UIView,它的layer加上CAKeyframeAnimation,而CAKeyframeAnimation的路径是love路径。
  • 把UIView的layer加入CAReplicatorLayer。并对设置CAReplicatorLayer相应属性即可。

实现


  • love路径
      UIBezierPath *tPath = [UIBezierPath bezierPath];
      [tPath moveToPoint:CGPointMake(SYS_DEVICE_WIDTH/2.0, 200)];
      [tPath addQuadCurveToPoint:CGPointMake(SYS_DEVICE_WIDTH/2.0, 400) controlPoint:CGPointMake(SYS_DEVICE_WIDTH/2.0 + 200, 20)];
      [tPath addQuadCurveToPoint:CGPointMake(SYS_DEVICE_WIDTH/2.0, 200) controlPoint:CGPointMake(SYS_DEVICE_WIDTH/2.0 - 200, 20)];
      [tPath closePath];
  • 生成一个UIView
      UIView *tView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
      tView.center = CGPointMake(SYS_DEVICE_WIDTH/2.0, 200);
      tView.layer.cornerRadius = 5;
      tView.backgroundColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
  • 给UIView添加上CAKeyframeAnimation动效
      CAKeyframeAnimation *loveAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
      loveAnimation.path = tPath.CGPath;
      loveAnimation.duration = 8;
      loveAnimation.repeatCount = MAXFLOAT;
      [tView.layer addAnimation:loveAnimation forKey:@"loveAnimation"];
  • 生成一个CAReplicatorLayer,并把UIView的layer加入其中
      _loveLayer = [CAReplicatorLayer layer];
      _loveLayer.instanceCount = 40;                // 复制39个子layer+原本的子layer共40个layer
      _loveLayer.instanceDelay = 0.2;               // 每隔0.2出现一个layer
      _loveLayer.instanceColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0].CGColor;
      _loveLayer.instanceGreenOffset = -0.03;       // 颜色值递减。
      _loveLayer.instanceRedOffset = -0.02;         // 颜色值递减。
      _loveLayer.instanceBlueOffset = -0.01;        // 颜色值递减。
  • [_loveLayer addSublayer:tView.layer];

    [self.view.layer addSublayer:_loveLayer];


  • CAReplicatorLayer里面还有一个instanceTransform属性,musicLayer就是用它的instanceTransform属性做的。所以还有很多效果可以做。就看你脑洞够不够大了。
  • 如果你有疑问或者发现错误请留言给我。3Q~~
  • 补一张图,不然文章没图片。。

//创建path

UIBezierPath *p11 = [UIBezierPath bezierPath];

[p11 setLineWidth:2.0];

[p11 moveToPoint:(CGPointMake(100, 200))];

[p11 addLineToPoint:(CGPointMake(150, 200))];

[p11 addLineToPoint:(CGPointMake(175, 150))];//zhong

p11.lineCapStyle = kCGLineCapSquare;

p11.lineJoinStyle =  kCGLineJoinMiter;

[p11 addLineToPoint:(CGPointMake(200, 200))];

[p11 addLineToPoint:(CGPointMake(250, 200))];

[p11 addLineToPoint:(CGPointMake(210, 230))];

[p11 addLineToPoint:(CGPointMake(235, 275))];

[p11 addLineToPoint:(CGPointMake(175, 250))];//

[p11 addLineToPoint:(CGPointMake(115, 275))];

[p11 addLineToPoint:(CGPointMake(140, 230))];

[p11 closePath];

CALayer *tView = [[CALayer alloc] init];

tView.frame = CGRectMake(0, 0, 10, 10);

//    tView.position = CGPointMake(self.view.frame.size.width/2, 400);

tView.cornerRadius = 5;

tView.backgroundColor = [UIColor whiteColor].CGColor;

tView.opacity = 0.1;

//移动Animation

CAKeyframeAnimation *loveAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];

loveAnimation.path = p11.CGPath;

loveAnimation.duration = 10;

loveAnimation.repeatCount = MAXFLOAT;

//缩放Animation

CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];

scaleAnimation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];

scaleAnimation.toValue = [NSValue valueWithCATransform3D:(CATransform3DMakeScale(0.15, 0.15, 1.0))];

scaleAnimation.duration = 1;

scaleAnimation.repeatCount = MAXFLOAT;

//透明度Animation

CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];

opacityAnimation.duration = 10;

opacityAnimation.toValue = @(1.0);

opacityAnimation.fillMode = kCAFillModeForwards;

//组动画

CAAnimationGroup *group = [CAAnimationGroup animation];

group.animations = @[loveAnimation,scaleAnimation,opacityAnimation];

group.duration = 10;

group.repeatCount = MAXFLOAT;

[tView addAnimation:group forKey:nil];

CAReplicatorLayer *loveLayer = [CAReplicatorLayer layer];

loveLayer.instanceCount = 40;

loveLayer.instanceDelay = 0.2;

loveLayer.instanceColor = [UIColor greenColor].CGColor;

loveLayer.instanceGreenOffset = -0.01;

loveLayer.instanceRedOffset = -0.01;

loveLayer.instanceBlueOffset = -0.01;

[loveLayer addSublayer:tView];

[self.view.layer addSublayer:loveLayer];

音乐动画

_musicLayer = [CAReplicatorLayer layer];

_musicLayer.frame = CGRectMake(0, 0, 60, 80);

_musicLayer.position = self.view.center;

_musicLayer.instanceCount = 3;

_musicLayer.instanceTransform = CATransform3DMakeTranslation(20, 0, 0);     //每个layer的间距。

_musicLayer.instanceDelay = 0.2;

_musicLayer.backgroundColor = [UIColor whiteColor].CGColor;

_musicLayer.masksToBounds = YES;

[self.view.layer addSublayer:_musicLayer];

CALayer *tLayer = [CALayer layer];

tLayer.frame = CGRectMake(10, 100, 10, 30);

tLayer.backgroundColor = [UIColor redColor].CGColor;

[_musicLayer addSublayer:tLayer];

CABasicAnimation *musicAnimation = [CABasicAnimation animationWithKeyPath:@"position.y"];

musicAnimation.duration = 0.35;

musicAnimation.fromValue = @(100);

musicAnimation.toValue = @(75);

musicAnimation.autoreverses = YES;

musicAnimation.repeatCount = MAXFLOAT;

[tLayer addAnimation:musicAnimation forKey:@"musicAnimation"];

时间: 2024-10-12 06:47:23

iOS quartzCore第六章—— CAReplicatorLayer的运用的相关文章

iOS quartzCore第五章——CAShapeLayer画各种图形 结合UIBezierPath

CAShapeLayer 是 CALayer 的子类,但是比 CALayer 更灵活,可以画出各种图形,当然,你也可以使用其他方式来画,随你. 首先CAShapeLayer 自身有path ,fillColor ,fillRule ,strokeColor ,strokeStart , strokeEnd , lineWidth(线宽,用点表示单位) ,miterLimit ,lineCap(线条结尾的样子) , lineJoin(线条之间的结合点的样子), lineDashPhase 和lin

增长黑客内容摘要(四五六章)

增长黑客内容摘要(四五六章) 一.第四章 4.1 职场社交巨头的用户激活秘诀 用户的数量与结成的关系网络深度直接决定了其价值的大小. 策略:1.新册用户到达“邀请好友”页面时,如果系统默认建议用户邀请的朋友数量少于4人,则他们很可能会轻易地忽略这一步骤:如果多于4人,则可能会让用户感到焦虑和麻烦:而不偏不倚刚好4人,能实现最大程度的邀请转化率.2.新注册用户源源不断地带来更多用户,同时老用户也会时不时回来看看,处理请求,或者主动发起好友邀请. 4.2 A/B测试,网站活跃率提升的法宝 备选方案模

《构建之法》第十六章读后感更正

第十六章IT行业的创新 1.关于灵感.灵光闪现固然重要,很多伟大的发明依靠的就是灵光一现的基础,但是灵光闪现的前提是个人的思考,长时间的思考.完成这一灵光的基础是不断的尝试,提高自己的技术.这样才会将自己的灵光变成一个实物而不是空想. 2.关于喜好.并不是人人都喜欢创新,因为创新本来就是个长耗时又难以被认可的东西.创新有需要考虑的因素有许多,个人.面子.优先级等等,现在人们更多的是支持在原有材料技术上的"线性发展"--扩充功能等. 3.关于想法.人们接受的并不是好的想法而是他们所需要的

数据库系统实现 第六章 查询执行

第六章 查询执行 查询执行也就是操作数据库的算法 一次查询的过程: 查询-->查询编译(第七章)-->查询执行(第六章)-->数据 查询编译预览 查询编译可以分为三个步骤: a)分析:构造分析树,用来表达查询和它的结构 b)查询重写,分析树被转化为初始查询计划,通常是代数表达式,之后初始的查询计划会被优化为一个时间更小的计划 c)物理计划生成,将查询计划转化成物理的计划, 为了选择更好的查询计划,需要判断 1)查询哪一个代数的等价形式是最有效的 2)对选中形式的每一个操作,所使用的算法选

第六章:异常机制

第六章:异常机制 异常的定义 异常:在程序运行过程中出现的意外事件,导致程序中断执行. 异常处理 try...catch 语法:try{ //可能出现异常的代码}catch(异常类型 异常对象名){ //处理异常的代码:}执行过程:当try中的代码异常发生时抛出一个异常对象,该异常对象与catch中异常类型进行匹配,匹配成功进入catch块,否则不执行catch中代码(相当于异常未被处理).程序只有当异常处理成功后才能继续执行. try...catch...catch 语法:try{ //可能出

2017上半年软考 第六章 重要知识点

第六章 项目整体管理 []项目整体管理概述 [][]项目整体管理的含义.作用和过程 项目整体管理6个过程?p264 项目整体管理包括什么? 项目管理的核心是什么? 项目整体管理涉及哪几个方面?p265 [][]项目经理是整合者 项目经理作为整合者要做什么?p265 [][]整体管理的地位 []项目整体管理实现过程 [][]制定项目章程概述 项目章程的意义是什么? 项目章程包括什么? [][]制定项目章程 项目章程的作用? 项目章程的输入? 制定项目章程的工具和技术?p267 项目章程的输出?p2

ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第六章:管理产品图片:多对多关系(上)

这章介绍了怎样创建一个新的实体来管理图片,怎样使用HTML窗体来上传图片文件和使用多对多关系来使它们与产品相关,并且怎样来保存图片到文件系统中.这章也介绍了更多复杂的错误处理增加客户端错误到模型中为了把它们显示回给用户.在这章中播种数据库使用的产品图片可能在在第六章的从Apress网页站点下载代码中. 注意:如果你想遵从这章的代码,你必须完成第五章的代码或者从www.apress.com下载第五章的源代码作为一个起点. 创建实体保存图片文件名 这个项目,我们正要使用文件系统在Web项目中存储图片

Linux与云计算——第二阶段Linux服务器架设 第六章:目录Directory服务器架设—FreeIPA

Linux与云计算--第二阶段Linux服务器架设 第六章:目录Directory服务器架设-FreeIPA 1 FreeIPA 配置FreeIPA服务器 Configure IPA Server to share users' account in your local network. [1] Install FreeIPA. [[email protected] ~]# yum -y install ipa-server ipa-server-dns bind bind-dyndb-lda

APUE读书笔记-第六章 系统数据文件和信息

昨天看完了,今天来看看第六章.感觉第六章的内容不是非常重要.简单看看吧 6.2 口令文件 口令文件其实就是/etc文件夹下的passwd文件,但处于安全性的考虑,我们无法直接读取它.就是通过直接限制权限的方式对其进行保护,passwd文件具体权限如下: -rw-r--r-- 1 root root 可以看到只有root用户具有读写权限,与root同组的用户与其他用户仅具有读权限. 不过为了解决以上问题,Linux中给出了一系列数据结构与函数帮助我们操纵口令文件,首先是关键数据结构,定义位于/in