【iOS】自定义CALayer可能会出现没有动画过程但有动画结果的解析
按照计划是要做成这样的动画
可是结果变成了这样
(有时候最重要的不是结果而是过程,日常鸡汤)
结果没有问题说明delegate中- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;成功执行,故此文不做讨论
让我们看看自定义的CALAyer的代码
- (void)drawInContext:(CGContextRef)ctx {
// self.lineWidth = 2;
self.endAngle = 360;
self.startAngle = 0;
CGFloat sColorR = 94.0 / 256;
CGFloat sColorG = 127.0 / 256;
CGFloat sColorB = 242.0 / 256;
CGFloat sColorA = 1;
CGFloat radius = self.bounds.size.width / 2;
CGFloat lineWidth = self.lineWidth;
UIBezierPath * path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(radius, radius) radius:radius - lineWidth / 2 startAngle:self.startAngle * M_PI * 2 / 360 endAngle:(self.endAngle == 0 ? 360 : self.endAngle) / 360 * M_PI * 2 * self.progress clockwise:YES];
CGContextSetRGBStrokeColor(ctx, sColorR, sColorG, sColorB, sColorA);//笔颜色
CGContextSetLineWidth(ctx, lineWidth);//线条宽度
CGContextAddPath(ctx, path.CGPath);
CGContextStrokePath(ctx);
}
- (instancetype)initWithLayer:(CircleProgressLayer *)layer {
if (self = [super initWithLayer:layer]) {
self.progress = layer.progress;
}
return self;
}
+ (BOOL)needsDisplayForKey:(NSString *)key {
if ([key isEqualToString:@"progress"]) {
return YES;
}
return [super needsDisplayForKey:key];
}
@end
看来貌似是self.lineWidth没有赋值的原因,那么这个时候我又分为两种情况来进行试着解决。
- 在
drawInContext()方法内对其赋值,结果有效。 - 在
CALayer外对其赋值,居然还是回到了之前错误的状况。
从方法的复用性来讲我们肯定提倡使用第二种方式对属性进行修改,所以在drawInContext()中我打了断点,如同设想中的一样,每进行一次动画的时候,该方法会调用几次,同时每次调用的时候我还发现了一件极其有趣的事情。
可以看到,每次调用方法的时候,self的指针都发现了不同程度的变化,而在使用CALayer的时候我肯定不会做重复init这么傻的事情的。所以可以推测出,在执行动画的过程中,iOS会一直在init新的CALayer,以期达到“动”画的效果直到动画结束。
所以可以推测出,没有动画过程的问题是在于“动”的过程中有些固定参数没有传达到新的init的CALayer上。那么我们应该要怎么传达原有CALayer的参数呢?
- (instancetype)initWithLayer:(CircleProgressLayer *)layer {
if (self = [super initWithLayer:layer]) {
self.progress = layer.progress;
self.lineWidth = layer.lineWidth;
}
return self;
}
也就是晚上之前的init方法就可以让原layer的参数一份不落地传递过来了,以上。
【iOS】自定义CALayer可能会出现没有动画过程但有动画结果的解析的更多相关文章
- [iOS Animation]-CALayer 显示动画
显式动画 如果想让事情变得顺利,只有靠自己 -- 夏尔·纪尧姆 上一章介绍了隐式动画的概念.隐式动画是在iOS平台创建动态用户界面的一种直接方式,也是UIKit动画机制的基础,不过它并不能涵盖所有的动 ...
- [iOS Animation]-CALayer 定时器动画
定时器的动画 我可以指导你,但是你必须按照我说的做. -- 骇客帝国 在第10章“缓冲”中,我们研究了CAMediaTimingFunction,它是一个通过控制动画缓冲来模拟物理效果例如加速或者减速 ...
- iOS 自定义转场动画浅谈
代码地址如下:http://www.demodashi.com/demo/11612.html 路漫漫其修远兮,吾将上下而求索 前记 想研究自定义转场动画很久了,时间就像海绵,挤一挤还是有的,花了差不 ...
- iOS 自定义转场动画
代码地址如下:http://www.demodashi.com/demo/12955.html 一.总效果 本文记录分享下自定义转场动画的实现方法,具体到动画效果:新浪微博图集浏览转场效果.手势过渡动 ...
- iOS自定义转场动画实战讲解
iOS自定义转场动画实战讲解 转场动画这事,说简单也简单,可以通过presentViewController:animated:completion:和dismissViewControllerA ...
- iOS 用CALayer实现动画
与动画有关的几个类的继承关系 涉及到动画的类主要有6个,看一下它们的基本用途: 1. CAAnimation 动画基类 2. CAAnimationGroup 组合多个动画 3. CAPropert ...
- 一行代码实现自定义转场动画--iOS自定义转场动画集
WXSTransition 这款非常不错,力推 这是作者源码简书地址: http://www.jianshu.com/p/fd3154946919 这是作者源码github地址 https://git ...
- iOS:CALayer核心动画层
CALayer:核心动画层 简介: Core Animation 是跨平台的,支持iOS环境和Mac OS X环境 学习核心动画之前,需要先理解CALayer,因为核心动画操作的对象不是UIView, ...
- [iOS Animation]-CALayer 性能优化
性能优化 代码应该运行的尽量快,而不是更快 - 理查德 在第一和第二部分,我们了解了Core Animation提供的关于绘制和动画的一些特性.Core Animation功能和性能都非常强大,但如果 ...
- ios基础动画、关键帧动画、动画组、转场动画等
概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画 ...
随机推荐
- [ELK] Docker 运行 Elastic Stack 支持 TLS 的两种简单方式
第一种就是 按照官方文档进行配置,指定证书位置开启. Run the Elastic Stack in Docker with TLS enabled. 第二种就是 9200 端口只暴露给本机,127 ...
- k8s问题解决
问题1: 问题描述:k8s中Terminating状态pod不能删除 [root@master ~]# kubectl get pods -n ms NAME READY STATUS RESTART ...
- 笔记06-第六讲 Cadence同一页面建立电气互连
笔记06-第六讲 Cadence同一页面建立电气互连 内容: 90度和任意角度连线; 连线方式; 十字线添加/删除连接点; Net alias; 无连接的管脚处理; 注意事项. 连线有两种方式,右侧工 ...
- 9、iptables 防火墙
1.iptables 基础规则 1.1.Linux 包过滤防火墙 netfilter 位于 Linux 内核中的包过滤功能体系 称为 Linux 防火墙的 "内核态" iptabl ...
- 基于改进MFCC特征和卷积递归神经网络的心音分类
具体的软硬件实现点击http://mcu-ai.com/MCU-AI技术网页_MCU-AI人工智能 心音分类在心血管疾病的早期发现中起着至关重要的作用,特别是对于小型初级卫生保健诊所.尽管近年来心音分 ...
- 03.go-admin代码生成器的使用
目录 简介 基于Gin + Vue + Element UI的前后端分离权限管理系统 一 编写go-admin应用,第1步 二.开始项目 三.建议开发目录 四.修改配置 五.代码生成 1. 导入表 2 ...
- cesium教程1-加载显示地图
1.完整示例代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 鸿蒙stage模型
app.json5全局的配置文件 icon和label是应用列表的 module.json5模块配置文件 中有一个abilities其中的icon和label才是桌面的图标和名称 日志的话就是hail ...
- OpenTelemetry agent 对 Spring Boot 应用的影响:一次 SPI 失效的
背景 前段时间公司领导让我排查一个关于在 JDK21 环境中使用 Spring Boot 配合一个 JDK18 新增的一个 SPI(java.net.spi.InetAddressResolverPr ...
- 【C#】做一个winform版本的软考成绩查询软件
返回的json SWCJ代表 上午的成绩 XWCJ代表下午的成绩. 主要步骤: 1. 获取验证码图片 2. 获取cookie 3. 发送验证验证码请求 4 发送成绩查询请求,并获取返回的json ...