美文网首页
CALayer 动画控制

CALayer 动画控制

作者: a2ebcc3676c1 | 来源:发表于2018-12-18 19:59 被阅读5次

CALayerCAAnimation都实现了CAMediaTiming 协议,可以通过CALayer实现协议中的属性来控制动画

1. 系统时间

  • 从手机开机到此刻硬件运行的时间秒数,也就是开机时长。
  • 通过CFTimeInterval time = CACurrentMediaTime()获取

2. 动画系统时间

  • 它是一套独立的时间
  • 一个动画对象动画时间是基于其父对象的动画时间来计算的
  • 动画时间与系统时间如何对应关系如下:
t = (tp - begin) * speed + timeOffset
  • t: 对象的动画时间
  • tp: 父对象的动画时间
  • begin: t.beginTime
  • 默认情况下,speed = 1, begin = 0, timeOffset = 0

3. 测试

CALayer * layer1 = [CALayer layer];
[self.view.layer addSublayer: layer1];

// 获取父对象时间
CFTimeInterval time1 = CACurrentMediaTime();

// 将父对象时间转化为子对象时间
CFTimeInterval time2 = [layer1 convertTime: time1 fromLayer: nil];

NSLog(@"systemTime - %lf", time1);
NSLog(@"layerTime - %lf", time2);

打印下面两个值,结果相等。默认情况下,动画系统的时间是和系统时间同步的

CALayer * layer1 = [CALayer layer];
layer1.beginTime = 1;
[self.view.layer addSublayer:layer1];
    
CALayer * layer2 = [CALayer layer];
layer2.beginTime = 1;
[layer1 addSublayer:layer2];
    
CFTimeInterval time1 = CACurrentMediaTime();
CFTimeInterval time2 = [layer1 convertTime:time1 fromLayer:nil];
CFTimeInterval time3 = [layer2 convertTime:time1 fromLayer:nil];

NSLog(@"systemTime - %lf", time1);
NSLog(@"layer1Time - %lf", time2);
NSLog(@"layer2Time - %lf", time3);

打印结果,layer1TimesystemTime多1秒,layer2TimesystemTime多2秒
分析:

  • layer1.beginTime = 1;即相对于系统时间加了1秒
  • layer2.beginTime = 1;,相对于layer1(layer1layer2的父对象)的时间增加了1秒,也就是比系统时间多了2秒

4. 控制动画

  • 暂停动画
let pausedTime      = layer.convertTime(CACurrentMediaTime(), from: nil)
layer.speed         = 0
layer.timeOffset    = pausedTime
  • 开始动画
let pausedTime      = layer.timeOffset
layer.speed         = 1.0
layer.timeOffset    = 0
let timeSincePause  = layer.convertTime(CACurrentMediaTime(), from: nil) - pausedTime
layer.beginTime     = timeSincePause

5. 参考文章:

动画的时间系统 - beginTime timeOffset属性

相关文章

  • CALayer 动画控制

    CALayer和CAAnimation都实现了CAMediaTiming 协议,可以通过CALayer实现协议中的...

  • 2018-07-05

    iOS 在控制器间跳转实现过渡动画 可以使用CALayer下的CATransition动画在同一个控制器下实现,但...

  • 隐式动画&显式动画 学习笔记

    隐式动画 CALayer的属性基本上都可以进行隐式动画 CATransaction可以控制隐式动画(执行时间或者关...

  • 动画 (1) ----- CALayer

    CALayer 和 UIView 联系CALayer的相关属性CALayer之隐式动画 一. CALayer 和 ...

  • 动画(基础篇--核心动画)

    须知: 动画分为 UIView动画 和 核心动画,而核心动画是直接作用在CALayer上的。 CALayer 1...

  • CATransition基础

    简介 CATransition通常用于通过CALayer控制UIView内子控件的过渡动画,比如删除子控件,添加子...

  •  iOS CoreAnimation核心动画总结

    一些日常的动画练习 //动画演示... iOS版动画 UIView与CALayer的关系:首先CALayer从NS...

  • Swift convertTime

    CALayer的动画设置:

  • UIView动画真面目--CALayer

    CALayer简介 在介绍动画操作之前我们必须先来了解一个动画中常用的对象CALayer。CALayer包含在Qu...

  • iOS 动画

    一、CALayer CALayer很多属性在修改时都能形成动画效果(不需要借助动画类),这种属性称为“隐式动画属性...

网友评论

      本文标题:CALayer 动画控制

      本文链接:https://www.haomeiwen.com/subject/afxrkqtx.html