利用 CAKeyframeAnimation实现任意轨迹移动
实现 利用 移动 任意 轨迹
2023-09-11 14:17:57 时间
![](https://img2018.cnblogs.com/blog/556239/201907/556239-20190729110110534-1248085321.gif)
自定义 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
这是一个大工程,请从工程中寻找相关模块代码.
相关文章
- 利用angular结合translate为项目实现国际化
- C#用DataTable实现Group by数据统计
- 免费内网穿透3389端口,实现外网远程桌面内网【无需公网IP】
- 第九节:深究并行编程Parallel类中的三大方法 (For、ForEach、Invoke)和几大编程模型(SPM、APM、EAP、TAP) 第八节:Task的各类Task<TResult>返回值以及通用线程的异常处理方案。 第七节:利用CancellationTokenSource实现任务取消和利用CancellationToken类检测取消异常。 第六节:深入研究Task实例方法Cont
- 利用OpenCV实现人眼的检测与跟踪
- 利用OpenCV的函数resize()实现图像的缩放(尺寸变换)
- 第8章-任务4-实现分数类中的运算符重载(分数与整数运算)
- [转]java利用AES实现URL的参数加密
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
- C#中利用委托实现多线程跨线程操作
- golang利用切片实现栈操作,附例子
- 利用ConcurrentHashMap来实现一个ConcurrentHashSet
- (数据科学学习手札65)利用Python实现Shp格式向GeoJSON的转换
- textarea如何实现高度自适应(不出现滚动条)
- 利用java自带的base64实现加密、解密
- Android 开发技术学习之Xpopup框架弹窗实现
- cesium结合geoserver利用WFS服务实现图层删除(附源码下载)
- Unity 工具类 之 简单的背景乐和音频音效管理类实现
- 利用HTML实现软件的UI
- 【鲲鹏应用迁移】实验:通过鲲鹏开发套件实现源码迁移
- 数仓实验三:分类规则挖掘实验(利用Python实现)
- 利用卷神经网络实现IOSLab数字手写图像识别