Swift开发之粒子动画的实现
粒子系统介绍
- 什么是粒子系统?
- 粒子系统是由总体具有相同的表现规律,个体却随机表现出不同的特征的大量显示元素构成的集合。
- 粒子定义有三要素
- 群体性:粒子系统是由“大量显示元素”构成的(例如雪、雨、一团雾等等)
- 统一性:粒子系统的每个元素具有相同的表现规律(例如下雨、下雪,方向都是从上向下)
- 随机性:粒子系统的每个元素又随机表现出不同特征(例如下雪,每个雪花下落的速度会有不同,大小会有不同、方向也会有略微的不同)
粒子系统应用场景
- 影视行业
- 目前我们经常看的大片,比如沙尘暴、暴风雨、暴雪、烟花 等等,很多都是粒子特效做出来的。很逼真,而且相比真实世界中去实拍,成本要低很多
- 游戏中
- 爆炸、雨、雪、雾、烟花等等。都是粒子系统实现
- 应用中
- 主播房间右下角粒子动画
- 雪花/下雨/烟花等效果
- QQ生日快乐一堆表情的跳动
iOS粒子动画的使用
- 步骤
- 创建发射器
- 创建粒子, 设置粒子属性
- swift核心代码
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// 1.创建发射器
let emitter = CAEmitterLayer()
// 2.设置发射器的位置
emitter.emitterPosition = point
// 3.开启三维效果
emitter.preservesDepth = true
// 4.创建例子, 并且设置例子相关的属性
var cells = [CAEmitterCell]()
for i in 0..<10 {
// 4.1.创建例子Cell
let cell = CAEmitterCell()
// 4.2.设置粒子速度
cell.velocity = 150
cell.velocityRange = 100
// 4.3.设置例子的大小
cell.scale = 0.7
cell.scaleRange = 0.3
// 4.4.设置粒子方向
cell.emissionLongitude = CGFloat(-Double.pi/2)
cell.emissionRange = CGFloat(Double.pi/2 / 6)
// 4.5.设置例子的存活时间
cell.lifetime = 3
cell.lifetimeRange = 1.5
// 4.6.设置粒子旋转
cell.spin = CGFloat(Double.pi/2)
cell.spinRange = CGFloat(Double.pi/2 / 2)
// 4.6.设置例子每秒弹出的个数
cell.birthRate = 2
// 4.7.设置粒子展示的图片
cell.contents = UIImage(named: "good\(i)_30x30")?.cgImage
// 4.8.添加到数组中
cells.append(cell)
}
// 5.将粒子设置到发射器中
emitter.emitterCells = cells
// 6.将发射器的layer添加到父layer中
view.layer.addSublayer(emitter)
粒子动画效果展示
源码
GitHub地址:ParticleAnimationDemo
C++ 之初体验
前言
C++与Objective-C都是在1980+年代诞生,所以语法糖上面都有很多相似地方,学起来并不难。至于我用的IDE,我直接用的是Xcode,很方便。
国际惯例,打印hello world
1 | cout << "hello world" << endl; |
这里介绍几个关键词:
cout 输出
cin 输入
endl 换行打印
cout 语法形式:
1 | cout << x << endl; |
cin 语法形式:
1 | cin >> x; |
这样的输入、输出方式有哪些便利?
1、不用关注占位符
2、不用关注数据类型
3、不易出现问题
C++命名空间(namespace)
在C++中,名称(name)可以是符号常量、变量、宏、函数、结构、枚举、类和对象等等。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入了关键字namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的作用域。
举个例子:同个年级有相同名字的同学,那样为了避免认错人,我们可以把他们分到不同班级里,这样就区分开来了。这里的班级就可以称为命名空间。
关于命名空间描述几点
1、使用namespace定义命名空间。
2、通过命名空间可以区分具有相同名字的变量。
3、通过命名空间可以区分具有相同名字的函数。
代码示例:
1 | #include <iostream> |
C++ 引用
代码示例:
1 | #include <iostream> |
C++ const关键字
代码示例:
1 | //const |
C++函数新亮点
函数参数默认值
1 | void fun( int i,int j=5,int k=10 );//有默认参数值的参数必须在参数表的最右端 |
函数重载
在相同作用域内
用同一个函数名定义的多个函数
参数个数和参数类型不同
内联函数
编译时将函数体代码和实参代替函数调用语句
内联函数关键字:inline
关于C++函数形参默认值的说法
1、当函数有多个形参时,可以都有默认值。
2、当函数有多个形参时,可以都没有默认值。
3、当函数有多个形参且都有默认值时,实参个数可以少于形参个数。
代码示例:
1 | #include <iostream> |
C++内存管理
什么是内存管理?
内存的本质是资源
操作系统掌管内存资源
对于我们开发者,我们能手动申请与归还
申请/归还内存资源就是内存管理
如图:
内容总结
使用new申请内存,使用delete释放内存
申请内存需要判断是否成功,释放内存需要设空指针
new与delete配套使用
代码示例:
1 | #include <string.h> |
「 iOS干货 」提高代码简洁的方法
前言
开发项目的时候,常常会有一些代码重复而且冗余,在用的时候需要写很长的代码或者用的地方也多,所以这个时候就需要集中起来封装,使代码复用性强,用短短的几行代码搞定。这些方法我都封装在category、tools、View
,加上代码里都有写注释,用起来很方便,实用性强,读起来也易懂,可以让代码更加的简洁。里面有一些也是参考别人源码,也做了下搬运工,希望对你们开发项目有所帮助。
简介
WTSDK
看目录结构就觉得清晰易懂,反正我是这么觉得的☺️
Category(分类)
NS(NS前缀的分类)
UI(UI前缀的分类)
看class名称
,它们都是对应对象的分类方法,里面扩展了很多实用性的功能,具体可以看源码。
Tool(工具类集合)
Singleton
是一个单例模式的宏使用方法:
在.h
里写上singleton_interface(类名称)
与.m
里写上singleton_implementation(类名称)
即完美支持MRC和ARC下的单例使用。WTConst
里面包括很多实用性很强的宏定义,具体看源码。WTUtility
里面定义了很多实用性很强的类方法,具体看源码。
View(UITextField与UITextView)
View
文件夹里包括UITextField
与UITextView
原生控件的封装。我一直觉得这两个原生控件每次用的时候都要加入好多的判断与代理方法,而且都是差不多一样的,所以我就针对这两个进行了封装,把常用的功能都集合在里面,比如限制文字输入长度等等,这样使用起来更加的方便和简洁。具体可以看下源码。
使用方法
你可以看下WTSDK
里面有啥需要的,单独拉某个文件到你的项目里使用即可。
如果你都要使用的话,直接导入#import "WTConst.h"
即可。
注意如果用到UIViewController+WT
还需要项目里有MBProgressHUD这个库。
####源码在这
GitHub 如果你觉得不错的话,麻烦你点一下Star,thank you all!
iOS集成Ping++支付,绕过一些坑
前言
这一段时间比较忙,主要公司的产品需要重构与加多一个货币支付系统。说到移动端的支付,自然会牵扯到支付这一块。支付这一块主流的目前就微信、支付宝、银联。做过这些SDK集成的开发者都知道,集成相对复杂,而且要花大量的时间去阅读他们提供的开发文档,不过还好现在有很多开发者都分享了他们的集成心得,使这件事越发简单,比如:iOS支付[支付宝、银联、微信]、10分钟搞定支付宝和微信支付 的 各种填坑等等,但是呢,其实还有更加简单的,Ping++。
iOS Runtime特性之关联对象
iOS Develop Tips
前言
记录一些代码小技巧持续更新!
Xcode12模板位置:
1 | /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates/iOS/Source/Cocoa Touch Class.xctemplate |
Objective-C tips
1、使控件从导航栏以下开始
1 | self.edgesForExtendedLayout=UIRectEdgeNone; |
2、将navigation返回按钮文字position设置不在屏幕上显示
1 | [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(NSIntegerMin, NSIntegerMin) forBarMetrics:UIBarMetricsDefault]; |
3、解决ScrollView等在viewController无法滚动到最顶部
1 | //自动滚动调整,默认为YES |
iOS播放GIF动画的几种方式
1.使用UIWebView播放
1 | #pragma clang diagnostic ignored "-Wnonnull" |