ios隐性动画


CAKeyframeAnimation->CAPropertyAnimation->CAAnimation 继承关系
CABasicAnimation->CAPropertyAnimation->CAAnimation 继承关系
示例动画(从某一点移动到另一点)

  • (CAKeyframeAnimation *)getMoveAnimation:(CGPoint)tpoint fromPoint:(CGPoint)fpoint index:(int)index {
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    // 设定动画起始帧和结束帧
    animation.calculationMode = kCAAnimationPaced;
    animation.fillMode = kCAFillModeForwards; //当动画结束后,layer会一直保持着动画最后的状态.
    animation.removedOnCompletion = NO; //当动画结束后,是否保留显示隐性层
    animation.repeatCount = 0; //重复次数,无限使用INFINITY
    animation.delegate = self;
    [animation setValue:@(index) forKey:@"AnimationViewIndex"];

    float d = sqrtf ((fpoint.x-tpoint.x)(fpoint.x-tpoint.x)+(fpoint.y-tpoint.y)(fpoint.y-tpoint.y));
    animation.duration = d/500; //所用时间

    CGMutablePathRef curvedPath = CGPathCreateMutable();
    CGPathMoveToPoint(curvedPath, 0, fpoint.x, fpoint.y);
    CGPathAddLineToPoint(curvedPath, 0, tpoint.x, tpoint.y);
    animation.path = curvedPath;
    CGPathRelease(curvedPath);

    return animation;
    }

caleculatuinMode:
kCAAnimationLinear calculationMode的默认值,表示当关键帧为座标点的时候,关键帧之间直接直线相连进行插值计算;

kCAAnimationDiscrete 离散的,就是不进行插值计算,所有关键帧直接逐个进行显示;

kCAAnimationPaced 使得动画均匀进行,而不是按keyTimes设置的或者按关键帧平分时间,此时keyTimes和timingFunctions无效;

kCAAnimationCubic 对关键帧为座标点的关键帧进行圆滑曲线相连后插值计算,这里的主要目的是使得运行的轨迹变得圆滑;
kCAAnimationCubicPaced 看这个名字就知道和kCAAnimationCubic有一定联系,其实就是在kCAAnimationCubic的基础上使得动画运行变得均匀,就是系统时间内运动的距离相同,此时keyTimes以及timingFunctions也是无效的.

fillMode:
kCAFillModeRemoved 这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
.
kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态.

kCAFillModeBackwards 在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始. 你可以这样设定测试代码,将一个动画加入一个layer的时候延迟5秒执行.然后就会发现在动画没有开始的时候,只要动画被加入了layer,layer便处于动画初始状态

kCAFillModeBoth 这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状

你可能感兴趣的:(ios隐性动画)