IOS中一个简单的粒子效果实现
1、效果图展示

2、实现思路
1> 首先要实现上面的效果,第一步要处理的就是一个简单的画板,在View上面用鼠标滑动的时候画出线条,这个功能可使用UIBezierPath实现
2> 关于粒子效果的实现,可以创建一个CALayer,然后用CAReplicatorLayer进行复制layer,从而达到粒子效果
3、代码实现
DrawView类的封装与编写
//
// DrawView.m
// 06-粒子效果
//
// Created by xgao on 16/11/24.
// Copyright (c) 2016年 xgao. All rights reserved.
// #import "DrawView.h" // 复制的实例个数
static int _instansCount = ; @interface DrawView () @property (nonatomic, strong) UIBezierPath *path; @property (nonatomic, weak) CALayer *dotLayer; @property (nonatomic, weak) CAReplicatorLayer *repL; @end @implementation DrawView #pragma mark - 懒加载点层
- (CALayer *)dotLayer{ if (_dotLayer == nil) {
// 创建图层
CALayer *layer = [CALayer layer]; CGFloat wh = ;
layer.frame = CGRectMake(, -, wh, wh);
layer.cornerRadius = wh / ;
layer.backgroundColor = [UIColor blueColor].CGColor;
// 将layer添加到CAReplicatorLayer中
[_repL addSublayer:layer]; _dotLayer = layer;
}
return _dotLayer;
} - (UIBezierPath *)path{ if (_path == nil) {
_path = [UIBezierPath bezierPath];
} return _path;
} #pragma mark - 开始点击调用 // 鼠标开始点击
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ // 获取touch对象
UITouch *touch = [touches anyObject];
// 获取当前触摸点
CGPoint curP = [touch locationInView:self]; // 设置起点
[self.path moveToPoint:curP];
} // 鼠标按住移动
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ // 获取touch对象
UITouch *touch = [touches anyObject];
// 获取当前触摸点
CGPoint curP = [touch locationInView:self]; // 添加线到某个点
[_path addLineToPoint:curP]; // 重绘
[self setNeedsDisplay]; _instansCount ++;
} - (void)drawRect:(CGRect)rect { // 进行路径线条的绘制
[_path stroke];
} #pragma mark - 开始动画
- (void)startAnim{ // 创建帧动画
CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
anim.keyPath = @"position";
anim.path = _path.CGPath;
anim.duration = ;
anim.repeatCount = MAXFLOAT;
[self.dotLayer addAnimation:anim forKey:nil]; // 注意:如果复制的子层有动画,先添加动画,再复制
// 复制子层
_repL.instanceCount = _instansCount; // 延迟图层动画
_repL.instanceDelay = 0.2; } #pragma mark - 加载完xib调用,创建复制层
- (void)awakeFromNib{ // 创建复制层
CAReplicatorLayer *repL = [CAReplicatorLayer layer];
repL.frame = self.bounds;
[self.layer addSublayer:repL]; _repL = repL;
} #pragma mark - 重绘
- (void)reDraw{ // 清空绘图信息
_path = nil;
[self setNeedsDisplay]; // 把图层移除父控件,复制层也会移除。
[_dotLayer removeFromSuperlayer];
_dotLayer = nil; // 清空子层总数
_instansCount = ;
}
@end
// 点击开始动画
- (IBAction)startAnim:(id)sender { DrawView *view = (DrawView *)self.view;
[view startAnim]; } // 重置按钮
- (IBAction)reDraw:(id)sender { DrawView *view = (DrawView *)self.view;
[view reDraw];
}
IOS中一个简单的粒子效果实现的更多相关文章
- iOS中XMPP简单聊天实现 好友和聊天
版权声明本文由陈怀哲首发自简书:http://www.jianshu.com/users/9f2e536b78fd/latest_articles;微信公众号:陈怀哲(chenhuaizhe2016) ...
- 如何让IOS中的文本实现3D效果
本转载至 http://bbs.aliyun.com/read/181991.html?spm=5176.7114037.1996646101.25.p0So7c&pos=9 zh ...
- Css实现一个简单的幻灯片效果页面
使用animation动画实现一个简单的幻灯片效果. 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 2 ...
- python中一个简单的webserver
python中一个简单的webserver 2013-02-24 15:37:49 分类: Python/Ruby 支持多线程的webserver 1 2 3 4 5 6 7 8 9 10 11 ...
- CSS布局中一个简单的应用BFC的例子
什么是BFC BFC(Block Formatting Context),简单讲,它是提供了一个独立布局的环境,每个BFC都遵守同一套布局规则.例如,在同一个BFC内,盒子会一个挨着一个的排,相邻盒子 ...
- 使用CSS实现一个简单的幻灯片效果
方法一: 简单的CSS代码实现幻灯片效果 方法二: 使用CSS3 Animation来制作幻灯片 方法一: 简单的CSS代码实现幻灯片效果 话不多说,直接上代码 <!DOCTYPE html&g ...
- iOS中 超简单抽屉效果(MMDrawerController)的实现
ios开发中,展示类应用通常要用到抽屉效果,由于项目需要,本人找到一个demo,缩减掉一些不常用的功能,整理出一个较短的实例. 首先需要给工程添加第三方类库 MMDrawerController: 这 ...
- 谈谈iOS中粘性动画以及果冻效果的实现
在最近做个一个自定义PageControl——KYAnimatedPageControl中,我实现了CALayer的形变动画以及CALayer的弹性动画,效果先过目: https://github.c ...
- 转:谈谈iOS中粘性动画以及果冻效果的实现
在最近做个一个自定义PageControl——KYAnimatedPageControl中,我实现了CALayer的形变动画以及CALayer的弹性动画,效果先过目: 先做个提纲: 第一个分享的主题是 ...
随机推荐
- Chronometer控件实现的Android计时器
本文为大家演示了如何使用Chronometer控件实现Android计时器的实例. 先贴上最终的实现效果图: Android计时器实现思路 使用Chronometer控件实现计器的操作.通过设置set ...
- NDK环境配置
1.下载安装插件:com.android.ide.eclipse.ndk_23.0.2.1259578.jar copy到E:\eclipse\adt-bundle-windows-x86- ...
- Swift常用语法示例代码(一)
此篇文章整理自我以前学习Swift时的一些练习代码,其存在的意义多是可以通过看示例代码更快地回忆Swift的主要语法. 如果你想系统学习Swift或者是Swift的初学者请绕路,感谢Github上Th ...
- iOS开发——网络编程Swift篇&(六)异步Post方式
异步Post方式 // MARK: - 异步Post方式 func asynchronousPost() { //创建NSURL对象 var url:NSURL! = NSURL(string: &q ...
- MySQL join buffer使用
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://huanghualiang.blog.51cto.com/6782683/12 ...
- W3C XML Schema 教程
转自:http://www.blogjava.net/sham2k/articles/179825.html W3C XML Schema 教程 XML SCHEMA教程 本教程是笔者学习W3C的&l ...
- linux【报错】userdel: user xiaoming is currently used by process 4713解决
学习linux的初学者肯定会遇到一些莫名其妙的问题,比如我,在学习删除一个用户的时候,就遇到上面的报错 userdel: user xiaoming is currently used by proc ...
- Linux下安装配置Node及memcached
这篇主要是记录Linux下安装Node及memcached遇到的问题及安装配置过程,方便日后查阅 Node安装及配置 [root@hostname ~]tar zxvf node-v0.12.4.ta ...
- poj 1848 树形dp
思路:表示我很弱,这个想不出dp方程,参考网上代码 #include<iostream> #include<algorithm> #include<cstring> ...
- poj 2942 点的双连通分量
思路: 对于该图,直接用建图貌似没法解,所以也很容易想到建补图,这样存在边的两个点就能再圆桌上做一起.也就将问题转化为对双连通分量中是否存在奇圈了. 我们将每次查询的边保存在stack中,当遇到关键点 ...