CALayer
和CAAnimation
都实现了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);
打印结果,layer1Time
比systemTime
多1秒,layer2Time
比systemTime
多2秒
分析:
-
layer1.beginTime = 1;
即相对于系统时间加了1秒 -
layer2.beginTime = 1;
,相对于layer1
(layer1
是layer2
的父对象)的时间增加了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
网友评论