美文网首页
iOS 基本动画

iOS 基本动画

作者: fcf7850dd33e | 来源:发表于2019-09-27 10:21 被阅读0次

    # CoreAnimation

    Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍。也就是说,使用少量的代码就可以实现非常强大的功能。

    从图中可以看出,最底层是图形硬件(GPU);上层是OpenGL和CoreGraphics,提供一些接口来访问GPU;再上层的CoreAnimation在此基础上封装了一套动画的API。最上面的UIKit属于应用层,处理与用户的交互。

    ![框架](https://img.haomeiwen.com/i14477290/b5e6b7fd1e842175.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    # Core Animation相关类

    ![类](https://img.haomeiwen.com/i14477290/fe37ecca294b8207.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    CAAnimation作为虚基类实现了CAMediaTiming协议。CAAnimation有三个子类CAAnimationGroup、CAPropertyAnimation、CATrasition。其中CAPropertyAnimation也有两个子类CABasicAnimation、CAKeyFrameAnimation。

    而其中CAAnimation、CAPropertyAnimation做为虚类,我们日常开发中无法使用。因此我们可用的类有CABasicAnimation、CAKeyFrameAnimation、CAAnimationGroup、CATrasition。

    ## CABasicAnimation

    基本动画的动画效果主要是通过(fromValue和toValue)、keyPath来控制,fromValue是所改变值的初始值、toValue是目标值。

    ```

    CABasicAnimation *moveAnimation = [CABasicAnimation animationWithKeyPath:@"position.y"];

    moveAnimation.duration = 0.8;//动画时间

    //动画起始值和终止值的设置

    moveAnimation.fromValue = @(300);

    moveAnimation.toValue = @(300-30);

    //一个时间函数,表示它以怎么样的时间运行

    moveAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];

    moveAnimation.repeatCount = HUGE_VALF;

    moveAnimation.repeatDuration = 2;

    moveAnimation.removedOnCompletion = NO;

    moveAnimation.fillMode = kCAFillModeForwards;

    //添加动画,后面有可以拿到这个动画的标识

    [self.imageView.layer addAnimation:moveAnimation forKey:@"moveAnimationKey"];

    ```

    keyPath有以下属性:

    ```

    transform.scale (比例转换)

    transform.scale.x

    transform.scale.y

    transform.rotation(旋转) 

    transform.rotation.x(绕x轴旋转)

    transform.rotation.y(绕y轴旋转)

    transform.rotation.z(绕z轴旋转)

    opacity (透明度)

    margin

    backgroundColor(背景色)

    cornerRadius(圆角)

    borderWidth(边框宽)

    bounds

    contents

    contentsRect

    cornerRadius

    frame

    hidden

    mask

    masksToBounds

    shadowColor(阴影色)

    shadowOffset

    shadowOpacity

    shadowOpacity

    ```

    ## CAKeyFrameAnimation

    CABasicAnimation 只能从一个数值(fromValue)变换成另一个数值(toValue),而 CAKeyframeAnimation 则会使用一个数组(values) 保存一组关键帧, 也可以给定一个路径(path)制作动画。

    ```

    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];

    NSMutableArray *values = [[NSMutableArray alloc]initWithCapacity:3];

    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)]];

    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.3, 1.3, 1.0)]];

    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.9, 0.9, 1.0)]];

    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1, 1.1, 1.0)]];

    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)]];

    animation.values = values;

    animation.duration = 0.5;

    animation.removedOnCompletion = YES;

    [self.imageView.layer addAnimation:animation forKey:nil];

    ```

    ## CAAnimationGroup

    动画组,是CAAnimation的子类,可以保存一组动画对象,将CAAnimationGroup对象加入层后,组中所有动画对象可以同时并发运行

    ```

    CAAnimationGroup *animationGroup = [CAAnimationGroup animation];

    animationGroup.animations = @[animation1,animation2];

    animationGroup.duration = 4;

    animation.repeatCount = 9;

    [self.imageView.layer addAnimation:animationGroup forKey:@"changeColor"];

    ```

    ## CATrasition

    CATransition是CAAnimation的子类,用于做转场/过渡动画,能够为层提供移出屏幕和移入屏幕的动画效果。

    ```

        CATransition *transition = [CATransition animation];

        transition.startProgress = 0;//开始进度

        transition.endProgress = 1;//结束进度

        transition.type = kCATransitionReveal;//过渡类型

        transition.subtype = kCATransitionFromLeft;//过渡方向

        transition.duration = 1.f;

        UIColor *color = [UIColor colorWithRed:arc4random_uniform(255) / 255.0 green:arc4random_uniform(255) / 255.0 blue:arc4random_uniform(255) / 255.0 alpha:1.f];

        self.imageView.layer.backgroundColor = color.CGColor;

        [self.imageView.layer addAnimation:transition forKey:@"transition"];

    ```

    ##总结

    其他的复杂动画都是由上面这些简单的动画组合而成的,在拿到效果图时可以先拆解一下。

    相关文章

      网友评论

          本文标题:iOS 基本动画

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