iOS核心动画学习整理
最近利用业余时间终于把iOS核心动画高级技巧(https://zsisme.gitbooks.io/ios-/content/chapter1/the-layer-tree.html)看完,对应其中一些知识做了相应的整理,整理为demo(https://github.com/PurpleSweetPotatoes/Layer_learn)。此demo中都是基于教程书籍中的编程示例,并加上了注解以方便各位iOS爱好者学习使用。
在这里利用此教程中的基础知识做了2个小demo,活动指示器效果和火焰效果。先让我们看看效果图
在这里我需要使用到CALayer的两个子类CAReplicatorLayer和CAEmitterLayer。
1.CAReplicatorLayer的目的是为了高效生成许多相似的图层。它会绘制一个或多个图层的子图层,并在每个复制体上应用不同的变换。此处直接搬出运行代码
1 //需要实例化的个数 2 int numofInstance = 10; 3 //动画时长 4 CGFloat duration = 1.0f; 5 //创建repelicator对象 6 CAReplicatorLayer *repelicator = [CAReplicatorLayer layer]; 7 //设置其位置 8 repelicator.frame = self.view.bounds; 9 //需要生成多少个相同实例 10 repelicator.instanceCount = numofInstance; 11 //代表实例生成的延时时间; 12 repelicator.instanceDelay = duration / numofInstance; 13 //设置每个实例的变换样式 14 repelicator.instanceTransform = CATransform3DMakeRotation(M_PI * 2.0 / 10.0, 0, 0, 1); 15 16 //创建repelicator对象的子图层,repelicator会利用此子图层进行高效复制。并绘制到自身图层上 17 CALayer *layer = [CALayer layer]; 18 //设置子图层的大小位置 19 layer.frame = CGRectMake(0, 0, 10, 10); 20 //子图层的仿射变换是基于repelicator图层的锚点,因此这里将子图层的位置摆放到此锚点附近。 21 CGPoint point = [repelicator convertPoint:repelicator.position fromLayer:self.view.layer]; 22 layer.position = CGPointMake(point.x, point.y - 20); 23 //设置子图层的背景色 24 layer.backgroundColor = [UIColor whiteColor].CGColor; 25 //将子图层切圆 26 layer.cornerRadius = 5; 27 //将子图层添加到repelicator上 28 [repelicator addSublayer:layer]; 29 //对layer进行动画设置 30 CABasicAnimation *animaiton = [CABasicAnimation animation]; 31 //设置动画所关联的路径属性 32 animaiton.keyPath = @"transform.scale"; 33 //设置动画起始和终结的动画值 34 animaiton.fromValue = @(1); 35 animaiton.toValue = @(0.1); 36 //设置动画时间 37 animaiton.duration = duration; 38 //设置动画次数 39 animaiton.repeatCount = INT_MAX; 40 //添加动画 41 [layer addAnimation:animaiton forKey:nil];
2.CAEmitterLayer是一个高性能的粒子引擎,被用来创建实时例子动画如:烟雾,火,雨等等这些效果。CAEmitterLayer看上去像是许多CAEmitterCell的容器,这些CAEmitterCell定义了一个粒子效果。下面直接上代码
1 - (CAEmitterLayer *)emitter { 2 if (_emitter == nil) { 3 //创建粒子图层容器 4 CAEmitterLayer *layer = [CAEmitterLayer layer]; 5 //设置发射器位置 6 layer.emitterPosition = self.view.center; 7 //设置发射器范围 8 layer.emitterSize = CGSizeMake(50, 30); 9 //设置发射器形状 10 layer.emitterShape = kCAEmitterLayerLine; 11 //设置发射器发射模式 12 layer.emitterMode = kCAEmitterLayerSurface; 13 //设置发射器的渲染模式 14 layer.renderMode = kCAEmitterLayerAdditive; 15 16 _emitter = layer; 17 } 18 return _emitter; 19 }
接着创建CAEmitterCell粒子图层并放入CAEmitterLayer容器中
1 //创建粒子 2 CAEmitterCell *cell = [CAEmitterCell emitterCell]; 3 //配置粒子图像 4 cell.contents = (__bridge id)[UIImage imageNamed:@"火焰"].CGImage; 5 //粒子每秒发射个数 6 cell.birthRate = 400; 7 //粒子生命周期 8 cell.lifetime = 3.0; 9 //粒子旋转角度 10 cell.spin = M_PI / 2; 11 //粒子颜色 12 cell.color = [UIColor colorWithRed:1.000 green:0.681 blue:0.178 alpha:1.000].CGColor; 13 //粒子衰减过程 14 cell.alphaSpeed -= 1; 15 //粒子发射速度 16 cell.velocity = 40; 17 //粒子发射速度可变范围,如果此处设置为10 则速度值在30 - 50 之类变动 18 cell.velocityRange = 10; 19 //粒子缩放比例 20 cell.scaleSpeed -= 1; 21 //cell发射角度范围 22 cell.emissionLongitude = 0; 23 //cell发射偏转角度 24 cell.emissionRange = M_PI / 4; 25 //将配置好的粒子放入容器中 26 self.emitter.emitterCells = @[cell];
此处编写这两种效果图旨在引起各位iOS爱好者的对动画和layer层学习的兴趣,如想深入学习请点击上面链接自行学习。另外欢迎大家与笔者一起学习交流,对于只求代码者一律不回,谢谢!上述有任何错误欢迎指正!
-----------------------如有转发请注明出处 ,谢谢!