CALayer 动画控制

2018-12-18  本文已影响5人  a2ebcc3676c1

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

1. 系统时间

2. 动画系统时间

t = (tp - begin) * speed + timeOffset

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秒
分析:

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属性

上一篇 下一篇

猜你喜欢

热点阅读