iOS开发核心动画之粒子效果

摘要:
我在原理图上画了一条线。单击以开始许多粒子围绕线移动。单击以重新绘制以消除粒子和第二行实现代码设计思想:自定义视图以描述控制器的视图,在视图加载过程中初始化它,向视图添加手势(UIPanGestureRecognizer),将自定义视图转换为复制层,创建粒子层,将其添加到复制层,并保存粒子以监视滑动手势,记录起点,在移动过程中添加一条线并重新绘制。3.代码实现1.自定义视图以描述控制器

一. 示意图

    绘画出一条线,点击开始有很多粒子绕着线运动,点击重绘消除粒子和线

iOS开发核心动画之粒子效果第1张


二. 实现代码

    设计思路:自定义一个View来描述控制器的View,在View加载过程中进行初始化,给View添加手势(UIPanGestureRecognizer),将自定义View转成复制层,创建一个粒子层,添加到复制层上,并保存粒子

    监听滑动手势,记录起始点,移动过程中添加直线并重绘


三. 代码实现

1. 自定义View来描述控制器View,将控制器View转为复制层

  1. + (Class)layerClass
  2. {
  3. return [CAReplicatorLayer class];
  4. }

2. 在加载控制器View初始化

初始化过程中创建滑动手势/创建复制层和粒子层

设置复制层相关属性:赋值个数/动画延迟时间

  1. - (void)awakeFromNib
  2. {
  3. [self setup];
  4. }
  5. - (void)setup
  6. {
  7. // 1.创建手势
  8. UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
  9. // 2.添加手势
  10. [self addGestureRecognizer:pan];
  11. // 3.创建粒子复制层
  12. CAReplicatorLayer *copyLayer = (CAReplicatorLayer *)self.layer;
  13. copyLayer.instanceCount = 30;
  14. copyLayer.instanceDelay = 0.25;
  15. CALayer *layer = [[CALayer alloc] init];
  16. layer.frame = CGRectMake(-10, 0, 10, 10);
  17. layer.backgroundColor = [UIColor redColor].CGColor;
  18. [copyLayer addSublayer:layer];
  19. self.dotlayer = layer;
  20. }

3. 将创建出来的粒子保存,设置一个UIBezierPater属性

  1. /** 路径 */
  2. @property (nonatomic, strong) UIBezierPath *path;
  3. /** 粒子 */
  4. @property (nonatomic, weak) CALayer *dotlayer;
4. 监听手势进行绘线
  1. // 监听手势
  2. - (void)pan:(UIPanGestureRecognizer *)pan
  3. {
  4. // 获取当前点
  5. CGPoint curP = [pan locationInView:self];
  6. if (pan.state == UIGestureRecognizerStateBegan) { // 开始滑动
  7. // 绘制起始点
  8. [self.path moveToPoint:curP];
  9. } else if (pan.state == UIGestureRecognizerStateChanged) {
  10. // 添加直线
  11. [self.path addLineToPoint:curP];
  12. // 重绘
  13. [self setNeedsDisplay];
  14. }
  15. }

5. UIBezierPater路径懒加载 

  1. // 路径懒加载
  2. - (UIBezierPath *)path
  3. {
  4. if (!_path) {
  5. UIBezierPath *path = [UIBezierPath bezierPath];
  6. _path = path;
  7. }
  8. return _path;
  9. }

6. 绘制

  1. // 绘制
  2. - (void)drawRect:(CGRect)rect {
  3. [self.path stroke];
  4. }

7. 线绘制完后点击开始,创建帧动画

  1. - (IBAction)start {
  2. // 1.创建帧动画
  3. CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
  4. anim.keyPath = @"position";
  5. anim.path = self.path.CGPath;
  6. anim.repeatCount = MAXFLOAT;
  7. anim.duration = 3;
  8. [self.dotlayer addAnimation:anim forKey:nil];
  9. }


8. 点击重绘

  1. - (IBAction)redraw {
  2. // 删除所有动画
  3. [self.dotlayer removeAllAnimations];
  4. // 销毁路径
  5. [self.path removeAllPoints];
  6. // 重绘
  7. [self setNeedsDisplay];
  8. }


免责声明:文章转载自《iOS开发核心动画之粒子效果》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇转:Windows 7下安装CentOS双系统轻量级ORM框架 第一篇:Dapper下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

css动画延迟好像有点怪

项目中需要使用到动画animate.css,在自定义的时候发现设置animation-delay 和 animation-duration 的总时间不对会导致 动画缺失。比如 bounceInLeft 动画 是从左边出现然后 抖动一下 ,当初始animation-delay为0,animation-duration为1s,动画完整,但是如果设置,anima...

iOS开发中权限再度梳理

前言 上篇文章iOS开发中的这些权限,你搞懂了吗?介绍了一些常用权限的获取和请求方法,知道这些方法的使用基本上可以搞定大部分应用的权限访问的需求。但是,这些方法并不全面,不能涵盖住所有权限访问的方法。 So,笔者在介绍一下剩下的几种权限的访问方法和一些使用上的注意事项,希望能给大家的开发过程带来一丝便利。 最后,笔者将经常使用的权限请求方法封装开源库JLA...

5+ App开发入门指南

HTML5 Plus应用概述 HTML5 Plus移动App,简称5+App,是一种基于HTML、JS、CSS编写的运行于手机端的App,这种App可以通过扩展的JS API任意调用手机的原生能力,实现与原生App同样强大的功能和性能。 HTML5 Plus规范 通过HTML5开发移动App时,会发现HTML5很多能力不具备。为弥补HTML5能力的不足,在...

UE4_攻击伤害1_射线检测

首先在武器的结构体中添加一个代表武器攻击范围的变量 设置上各武器的攻击距离(ps.ue4里的默认单位是厘米,如图长矛的攻击距离是200cm) 读取当前武器的距离,发射相应长度的射线用于判定。 在播放声音之前新建一个动画通知,用于通知该发射判定射线了 然后把长矛的其他两个蓝图也加上同样的动画通知。 在动画蓝图的事件图表中写入逻辑。 当my attack...

iOS学习——核心动画

iOS学习——核心动画1、什么是核心动画   Core Animation(核心动画)是一组功能强大、效果华丽的动画API,无论在iOS系统或者在你开发的App中,都有大量应用。核心动画所在的位置如下图所示,可以看到,核心动画位于UIKit的下一层,相比UIView动画,它可以实现更复杂的动画效果。   核心动画作用在CALayer(Core anima...

移动端动画lottie 和 svga的区别

Lottie  只需要 ui设计师给到json动画文件,像img图片一样import引入即可,对应属性   链接:https://juejin.cn/post/6844903661760413704  或者去官网查看 http://airbnb.io/lottie/#/  svga上来需要先播放动画的dom存在,动态的dom不太适合,官网链接 :htt...