按照计划是要做成这样的动画

可是结果变成了这样

(有时候最重要的不是结果而是过程,日常鸡汤)

结果没有问题说明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可能会出现没有动画过程但有动画结果的解析的更多相关文章

  1. [iOS Animation]-CALayer 显示动画

    显式动画 如果想让事情变得顺利,只有靠自己 -- 夏尔·纪尧姆 上一章介绍了隐式动画的概念.隐式动画是在iOS平台创建动态用户界面的一种直接方式,也是UIKit动画机制的基础,不过它并不能涵盖所有的动 ...

  2. [iOS Animation]-CALayer 定时器动画

    定时器的动画 我可以指导你,但是你必须按照我说的做. -- 骇客帝国 在第10章“缓冲”中,我们研究了CAMediaTimingFunction,它是一个通过控制动画缓冲来模拟物理效果例如加速或者减速 ...

  3. iOS 自定义转场动画浅谈

    代码地址如下:http://www.demodashi.com/demo/11612.html 路漫漫其修远兮,吾将上下而求索 前记 想研究自定义转场动画很久了,时间就像海绵,挤一挤还是有的,花了差不 ...

  4. iOS 自定义转场动画

    代码地址如下:http://www.demodashi.com/demo/12955.html 一.总效果 本文记录分享下自定义转场动画的实现方法,具体到动画效果:新浪微博图集浏览转场效果.手势过渡动 ...

  5. iOS自定义转场动画实战讲解

    iOS自定义转场动画实战讲解   转场动画这事,说简单也简单,可以通过presentViewController:animated:completion:和dismissViewControllerA ...

  6. iOS 用CALayer实现动画

    与动画有关的几个类的继承关系 涉及到动画的类主要有6个,看一下它们的基本用途: 1. CAAnimation  动画基类 2. CAAnimationGroup 组合多个动画 3. CAPropert ...

  7. 一行代码实现自定义转场动画--iOS自定义转场动画集

    WXSTransition 这款非常不错,力推 这是作者源码简书地址: http://www.jianshu.com/p/fd3154946919 这是作者源码github地址 https://git ...

  8. iOS:CALayer核心动画层

    CALayer:核心动画层 简介: Core Animation 是跨平台的,支持iOS环境和Mac OS X环境 学习核心动画之前,需要先理解CALayer,因为核心动画操作的对象不是UIView, ...

  9. [iOS Animation]-CALayer 性能优化

    性能优化 代码应该运行的尽量快,而不是更快 - 理查德 在第一和第二部分,我们了解了Core Animation提供的关于绘制和动画的一些特性.Core Animation功能和性能都非常强大,但如果 ...

  10. ios基础动画、关键帧动画、动画组、转场动画等

    概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画 ...

随机推荐

  1. [PHP] Laravel 依赖注入使用不当引起的内存溢出

    业务逻辑: 正常在 controller 方法的参数中注入某个类,方法中使用这个类时发生内存超出提示. 分析: 过往显示,正常使用依赖注入是不存在问题的,那么很有可能是哪里发生了循环引用,导致一直请求 ...

  2. Postergresql常见操作

    Postergresql常见操作 1. 安装部署 略 2. 登录数据库 查看版本 ## 以管理员身份 postgres 登陆,然后通过#psql -U postgres#sudo -i -u post ...

  3. iOS中atomic修饰符的底层实现

    在iOS中,atomic表示一个类的属性getter/setter具有原子性.那么iOS底层是如何保证这种原子性的呢? 我们有一个类A,它有一个属性X具有atomic: @property (atom ...

  4. java里面的方法。

    java里面的方法. java方法是语句的组合,他们在一起执行一个功能. 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建在其他地方被引用 方法类似于其他语言里面的函数 e ...

  5. vscode开发uniapp

    VS Code 对 TS 类型支持友好,前端开发者主流的编辑器 HbuilderX 对 TS 类型支持暂不完善,期待官方完善 工作区禁用 Vetur 插件(Vue2 插件和 Vue3 插件冲突) 工作 ...

  6. JDK源码阅读-------自学笔记(十)(java.lang.Integer包装类初探)

    自动装箱和拆箱 JDK1.5后,Java引入了自动装箱(autoboxing)/拆箱(unboxing) 自动装箱 基本数据类型在需要时自动转化为对象 自动装箱 对象在需要时自动转化为基本数据类型 注 ...

  7. 5GC 系统架构

    目录 文章目录 目录 前文列表 4G/5G 核心网对比 4G/5G 核心网融合架构 5GC 架构 AMF 功能 SMF 功能 NSSF 功能 UPF 功能 AF.PCF & NEF 功能 BS ...

  8. 在 ThinkPad E470 上安装 Ubuntu 16.04 无线网卡驱动

    目录 文章目录 目录 安装 安装 # 查看无线网卡驱动类型,E470 一般为 RTL8821CE lspci # 安装必要工具 sudo apt-get install build-essential ...

  9. 深入Django项目实战与最佳实践

    title: 深入Django项目实战与最佳实践 date: 2024/5/19 21:41:38 updated: 2024/5/19 21:41:38 categories: 后端开发 tags: ...

  10. Azure Service Principals ----- Azure 上最好保守的秘密的服务

    一,引言 Azure Service Principals 是 Azure Active Directory (AAD) 中的一种标识,代表应用程序,服务,自动化流程.Service Principa ...