利用 CAKeyframeAnimation实现任意轨迹移动

自定义 View,实现以下方法即可
- (void)drawRect:(CGRect)rect {
// Drawing code
// 初始化UIBezierPath
UIBezierPath *path = [UIBezierPath bezierPath];
// 首先设置一个起始点
/////左半边曲线
CGPoint startPoint = CGPointMake(rect.size.width/2, rect.size.height*0.4);
// 以起始点为路径的起点
[path moveToPoint:startPoint];
// 设置一个终点
CGPoint endPoint = CGPointMake(rect.size.width/2, rect.size.height- rect.size.height*0.1);
// 设置第一个控制点
CGPoint controlPoint1 = CGPointMake(self.bounds.size.width*0.1, rect.size.height*0.1);
// 设置第二个控制点
CGPoint controlPoint2 = CGPointMake(0, self.size.height*0.7);
// 添加三次贝塞尔曲线
[path addCurveToPoint:endPoint controlPoint1:controlPoint1 controlPoint2:controlPoint2];
// 设置另一个起始点
[path moveToPoint:endPoint];
//右半边曲线>>>>>>>>>>>>>>>>>>>>
// 设置第三个控制点
CGPoint controlPoint3 = CGPointMake(rect.size.width-self.bounds.size.width*0.1, rect.size.height*0.1);
// 设置第四个控制点
CGPoint controlPoint4 = CGPointMake(rect.size.width, self.size.height*0.7);
// 添加三次贝塞尔曲线
[path addCurveToPoint:startPoint controlPoint1:controlPoint4 controlPoint2:controlPoint3];
// 设置线宽
path.lineWidth = 3;
// 设置线断面类型
path.lineCapStyle = kCGLineCapRound;
// 设置连接类型
path.lineJoinStyle = kCGLineJoinRound;
// 设置画笔颜色
[[UIColor redColor] set];
[path stroke];
UIView *heart = [[UIView alloc] init];
heart.frame = CGRectMake(0, 0, 20 , 20);
heart.backgroundColor =[UIColor redColor];
[self addSubview:heart];
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
// 设置动画的路径为心形路径
animation.path = path.CGPath;
// 动画时间间隔
animation.duration = 3.0f;
// 重复次数为最大值
animation.repeatCount = FLT_MAX;
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;
//设置加速度
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
// 将动画添加到动画视图上
[heart.layer addAnimation:animation forKey:nil];
}
Demo地址:https://github.com/yuying2012/WJDStudyLibrary
这是一个大工程,请从工程中寻找相关模块代码.
利用 CAKeyframeAnimation实现任意轨迹移动的更多相关文章
- 利用最小二乘法拟合任意次函数曲线(C#)
原文:利用最小二乘法拟合任意次函数曲线(C#) ///<summary> ///用最小二乘法拟合二元多次曲线 ///</summary> ///< ...
- 利用arguments求任意数量数字的和/最大值/最小值
文章地址 https://www.cnblogs.com/sandraryan/ arguments是函数内的临时数据,用完销毁,有类似于数组的操作,但不是数组. 举个栗子1:利用arguments求 ...
- 利用msg_msg实现任意地址读写
利用msg_msg实现任意地址读写 msgsnd和msgrcv的源码分析 内核通过msgsnd和msgrcv来进行IPC通信.内核消息分为两个部分,一个是消息头msg_msg(0x30),以及后面跟着 ...
- 利用geojson实现模型轨迹运动
直接上代码 var viewer = new Cesium.Viewer('cesiumContainer'); //Set the random number seed for consistent ...
- 利用SVN进行任意文件对比
都知道SVN可以比较已经上传的文件的内容,看到两个文件有什么不同的地方. 但是有时候并不想上传想要比较的文件,能不能利用SVN这样一个功能去比较别的两个文件呢? 琢磨来琢磨去, 发现只要在资源管理器里 ...
- (一一五)利用NSKeyedArchiver实现任意对象转为二进制
[应用背景] 在数据库中存储数据时,如果对象过于复杂,又不必要创建复杂的表,可以直接把整个对象转化为二进制存入数据库字段,然后取出后再还原即可. [实现方法] 在PHP中,使用序列化和反序列化可以实现 ...
- Java -- 利用反射 操作任意数组,包括对象数组 和 基本数据类型的数组
items为任意数组
- 转: c#.net利用RNGCryptoServiceProvider产生任意范围强随机数的办法
//这样产生0 ~ 100的强随机数(含100) ; int rnd = int.MinValue; decimal _base = (decimal)long.MaxValue; ]; System ...
- c#.net利用RNGCryptoServiceProvider产生任意范围强随机数的办法
//这样产生0 ~ 100的强随机数(含100)int max = 100;int rnd = int.MinValue;decimal _base = (decimal)long.MaxValue; ...
随机推荐
- aar api 导出
import fsys; import math; var pidMap = {}; math.randomize(); fsys.enum( "~\lib", "*.* ...
- 【计算机视觉】OpenCV篇(6) - 平滑图像(卷积/滤波/模糊/降噪)
平滑滤波 平滑滤波是低频增强的空间域滤波技术.空间域滤波技术即不经由傅立叶转换,直接处理影像中的像素,它的目的有两类:一类是模糊:另一类是消除噪音.空间域的平滑滤波一般采用简单平均法进行,就是求邻近像 ...
- Swift 4.0 Xib实现Button调整
1.Xib画的界面按钮,代码中进行调整按钮图片在上,文字在下: 代码中修改按钮的位置比较好: payButton.titleEdgeInsets = UIEdgeInsetsMake((payButt ...
- C++ 顺序容器(vector,list、deque,stack,queue)
顺序容器的种类有:vector,list.deque 顺序容器适配器: stack //先进后出 栈 queue //先进先出 队列 priority_queue //也优先管 ...
- Caused by: java.lang.NullPointerException: Location is required
将 Parent root = FXMLLoader.load(getClass().getResource("xml/MainUI.fxml")); 改为: Parent roo ...
- mysql数据表的编辑
创建数据表 create table [if not exists] 表名(字段列表, [约束或索引列表]) [表选项列表]; 删除数据表 drop table [if exists] ...
- Linux如何查看进程、杀死进程、启动进程
1.查看进程:ps命令 下面的命令还没实践,仅仅供你参考:可以用man ps查看格式,只不过是一个小工具而已! ps a 显示现行终端机下的所有程序,包括其他用户的程序. ps -A 显示所有程 ...
- [转帖]MyCat教程【简单介绍】
MyCat教程[简单介绍] 2019-10-15 10:27:23 波波烤鸭 阅读数 618 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. ...
- javascript常用小案例
常用javascript小案例 样式调节 //注: 这个可以控制td中的字段成行显示 #modelInfos td,th { white-space: nowrap; } //文本输入框随着内容尺寸往 ...
- 机器学习xgboost参数解释笔记
首先xgboost有两种接口,xgboost自带API和Scikit-Learn的API,具体用法有细微的差别但不大. 在运行 XGBoost 之前, 我们必须设置三种类型的参数: (常规参数)gen ...