Core Animation

来源:互联网 发布:网络业务割接方案 编辑:程序博客网 时间:2024/04/28 02:54

速度控制函数(CAMediaTimingFunction) 

1.kCAMediaTimingFunctionLinear(线性):匀速,给你一个相对静态的感觉

2.kCAMediaTimingFunctionEaseIn(渐进):动画缓慢进入,然后加速离开

3.kCAMediaTimingFunctionEaseOut(渐出):动画全速进入,然后减速的到达目的地

4.kCAMediaTimingFunctionEaseInEaseOut(渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。这个是默认的动画行为。


CAAnimation在分类中定义了代理方法

@interface NSObject (CAAnimationDelegate)

- (void)animationDidStart:(CAAnimation *)anim;

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;

@end


fillMode属性值(要想fillMode有效,最好设置removedOnCompletion=NO

kCAFillModeRemoved 这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
kCAFillModeForwards
当动画结束后,layer会一直保持着动画最后的状态
kCAFillModeBackwards
在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始.你可以这样设定测试代码,将一个动画加入一个layer的时候延迟5秒执行.然后就会发现在动画没有开始的时候,只要动画被加入了layer,layer便处于动画初始状态
kCAFillModeBoth
这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状


CALayer上动画的暂停和恢复

// t - active local time   图层的本地时间

// tp - parent layer time  父图层的时间

// 父图层和图层本地的时间换算公式

// t = (tp - beginTime) * speed + timeOffset

// beginTime = tp - (t - timeOffset)/speed

#pragma mark 暂停CALayer的动画

-(void)pauseLayer:(CALayer*)layer

{

    CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];

    layer.speed = 0.0; // CALayer的时间停止走动

    layer.timeOffset = pausedTime; // CALayer的时间停留在pausedTime这个时刻

}

#pragma mark 恢复CALayer的动画

-(void)resumeLayer:(CALayer*)layer

{

    CFTimeInterval pausedTime = layer.timeOffset;

    layer.speed = 1.0; // CALayer的时间继续行走

    layer.timeOffset = 0.0; // 取消上次记录的停留时刻

    layer.beginTime = 0.0; // 取消上次设置的时间

    

    // 计算暂停的时间(这里用CACurrentMediaTime()-pausedTime也是一样的)

    CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;

    // 设置相对于父坐标系的开始时间(往后退timeSincePause)

    layer.beginTime = timeSincePause;

}

0 0