https://blog.csdn.net/qiwenmingshiwo/article/details/75806637

粒子效果路径移动
一说明
1 效果
2 步骤分析
二代码
1 VCViewh
2 VCViewm
3 ViewControllerm
粒子效果——路径移动
一、说明
1.1 效果
效果如图

1.2 步骤分析
我们需要上面的效果,可以按照以下的步骤来操作:

第一步:我们需要创建一个View来支持我们的这种效果(VCView)

第二步:我们需要添加一个手势,创建一个路径,来记录这个手势的移动,并实现我们的绘制功能

第三步:使用复制层来添加粒子

需要支持复制层的功能,那么我们的这个View(VCView)的layer应该是复制层

+(Class)layerClass{
//复制层
return [CAReplicatorLayer class];
}
1
2
3
4
创建一个粒子,并且把粒子添加到复制层

//添加粒子
CALayer *dotL = [CALayer layer];
dotL.frame = CGRectMake(-20, 0, 20, 20);
dotL.backgroundColor = [UIColor redColor].CGColor;
self.dotLayer = dotL;
[self.layer addSublayer:dotL];
1
2
3
4
5
6
复制粒子

//复制粒子
CAReplicatorLayer *repL = (CAReplicatorLayer*)self.layer;
repL.instanceCount = 30;
repL.instanceDelay = 0.2;
1
2
3
4
第四步:添加动画

第五步:实现重绘制功能

注意:我们使用的是自定义的VCView

二、代码
2.1 VCView.h
//
// VCView.h
// 03_UIView77_粒子效果1
//
// Created by 杞文明 on 17/7/22.
// Copyright © 2017年 杞文明. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface VCView : UIView
//开始动画
- (void)start;
//重绘
- (void)reDraw;
@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2.2 VCView.m
//
// VCView.m
// 03_UIView77_粒子效果1
//
// Created by 杞文明 on 17/7/22.
// Copyright © 2017年 杞文明. All rights reserved.
//

#import "VCView.h"

@interface VCView()

@property(nonatomic,strong)UIBezierPath *path;
@property(nonatomic,strong)CALayer *dotLayer;

@end

@implementation VCView

+(Class)layerClass{
//复制层
return [CAReplicatorLayer class];
}

//开始动画
- (void)start{
//创建帧动画
CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
anim.keyPath = @"position";
anim.path = self.path.CGPath;
anim.repeatCount = MAXFLOAT;
anim.duration = 6;
[self.dotLayer addAnimation:anim forKey:nil];
}

//重绘
- (void)reDraw{
//删除所有动画
[self.dotLayer removeAllAnimations];
//清空路径
[self.path removeAllPoints];
//重绘
[self setNeedsDisplay];
}

-(void)awakeFromNib{
//添加手势
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(pan:)];
[self addGestureRecognizer:pan];

//添加粒子
CALayer *dotL = [CALayer layer];
dotL.frame = CGRectMake(-20, 0, 20, 20);
dotL.backgroundColor = [UIColor redColor].CGColor;
self.dotLayer = dotL;
[self.layer addSublayer:dotL];

//复制粒子
CAReplicatorLayer *repL = (CAReplicatorLayer*)self.layer;
repL.instanceCount = 30;
repL.instanceDelay = 0.2;

//创建路径
self.path = [UIBezierPath bezierPath];
}

-(void)pan:(UIPanGestureRecognizer *)pan{
//或者手指当前的点
CGPoint curentP = [pan locationInView:self];

//手势开始,移动到开始的点
if(pan.state == UIGestureRecognizerStateBegan){
[self.path moveToPoint:curentP];
}else if (pan.state == UIGestureRecognizerStateChanged){
//添加点
[self.path addLineToPoint:curentP];
//重绘
[self setNeedsDisplay];
}
}

-(void)drawRect:(CGRect)rect{
[self.path stroke];
}

@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
2.3 ViewController.m
//
// ViewController.m
// 03_UIView77_粒子效果1
//
// Created by 杞文明 on 17/7/22.
// Copyright © 2017年 杞文明. All rights reserved.
//

#import "ViewController.h"
#import "VCView.h"

@interface ViewController ()
@property (strong, nonatomic) IBOutlet VCView *vcView;

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
}
- (IBAction)start:(id)sender {
[self.vcView start];
}
- (IBAction)reDraw:(id)sender {
[self.vcView reDraw];
}

@end
————————————————
版权声明:本文为CSDN博主「愤怒的小明」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qiwenmingshiwo/article/details/75806637

iOS学习笔记-084.粒子效果——路径移动的更多相关文章

  1. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

  2. iOS学习笔记10-UIView动画

    上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...

  3. iOS学习笔记总结整理

    来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...

  4. iOS学习笔记-地图MapKit入门

    代码地址如下:http://www.demodashi.com/demo/11682.html 这篇文章还是翻译自raywenderlich,用Objective-C改写了代码.没有逐字翻译,如有错漏 ...

  5. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...

  6. [置顶] iOS学习笔记47——图片异步加载之EGOImageLoading

    上次在<iOS学习笔记46——图片异步加载之SDWebImage>中介绍过一个开源的图片异步加载库,今天来介绍另外一个功能类似的EGOImageLoading,看名字知道,之前的一篇学习笔 ...

  7. WebGL three.js学习笔记 使用粒子系统模拟时空隧道(虫洞)

    WebGL three.js学习笔记 使用粒子系统模拟时空隧道 本例的运行结果如图: 时空隧道demo演示 Demo地址:https://nsytsqdtn.github.io/demo/sprite ...

  8. iOS学习笔记-自己动手写RESideMenu

    代码地址如下:http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars数 ...

  9. iOS学习笔记-自定义过渡动画

    代码地址如下:http://www.demodashi.com/demo/11678.html 这篇笔记翻译自raywenderlick网站的过渡动画的一篇文章,原文用的swift,由于考虑到swif ...

随机推荐

  1. Jquery 遍历 Table;遍历CheckBox ;遍历Select;全选/全不选

    关于Jquery:相信大家已经很熟悉了,我最近的项目运用到关于Jquery的遍历事件:权当总结下: 遍历Table <table  id="thistab"> < ...

  2. css实现字母或数字强制换行

    //换行white-space:normal;word-break:break-all;word-wrap: break-word; 相关属性white-space: normal|pre|nowra ...

  3. 手把手教你接口自动化测试 – SoapUI & Groovy【转】

    手把手教你接口自动化测试 – SoapUI & Groovy Posted on 2015-01-21 09:38 WadeXu 阅读(12741) 评论(10) 编辑 收藏 手把手教你接口自 ...

  4. Servlet3.0要点小结

    1. 注解配置Servlet @WebServlet name属性: servlet名称 value属性或urlPatterns属性: servlet映射路径, 可配置多个 initParams属性: ...

  5. token 与 基于JWT的Token认证

    支持跨域访问,无状态认证 token特点 支持跨域访问: Cookie是不允许垮域访问的,这一点对Token机制是不存在的,前提是传输的用户认证信息通过HTTP头传输 无状态(也称:服务端可扩展行): ...

  6. Python3基础笔记_字符串类型

    # 1.Python转义字符 a = "sqwerdf" # 2.Python字符串运算符 ''' + 字符串连接 a + b 输出结果: HelloPython * 重复输出字符 ...

  7. 在DataWorks中实现指定UDF只能被指定账户访问

    背景 之前写过一篇文章是关于“DataWorks和MaxCompute内部权限体系的区别”有兴趣的朋友可以点击阅读查看详情.但是还是有些同学会问,我如何在DataWorks中实现我的具体某个Resou ...

  8. LUOGU P4777 【模板】扩展中国剩余定理(EXCRT)

    传送门 解题思路 扩展 $crt​$,就是中国剩余定理在模数不互质的情况下,首先对于方程 ​     $\begin{cases} x\equiv a_1\mod m_1\\x\equiv a_2\m ...

  9. flink第一个应用

    去年华为大佬就开始在用flink,今天刚有空就稍微跟着写了个demo玩起来(就不用java了 spark和flink还是用scala玩) package flink.testimport org.ap ...

  10. idea查看jar冲突和解决方法

    选中Dependencies,点上边那个按钮,出现下图 依赖图太小了,根本没法看啊?好办,点击鼠标右键,呼出右键菜单栏,然后点击Actual Size: 如果我们仔细观察上图,会发现在项目依赖图中,有 ...