iOS 开发中的动画 CoreAnimation

前面iOS 开发动画 View Animation讲的都是基于 UIView 的系统封装的高级 API。CoreAnimation 是在 Layer层上操作添加动画,可以做出更复杂的动画。

UIView 和 CALayer 的区别:

(1) UIView 是继承自 UIResponse,可以处理响应事件,CALayer 是继承自 NSObject,只负责内容的创建和绘制。
(2) UIView 负责内容的管理,CALayer 负责内容的绘制。
(3) UIView 的位置属性 frame bounds center 而 CALayer除了这些属性之外还有 anchorPoint position
(4) CALayer 可以实现 UIView 很多无法实现的功能

注意:CoreAnimation 的动画执行过程都是在后台执行的,不会阻塞主线程。

CABaseAnimation

常用的属性
animation.keyPath // 动画操作的属性
animation.toValue // 属性值的最终值
animation.duration // 动画执行的时间
animation.fillMode // 执行后的状态
animation.isRemovedOnCompletion // 动画执行后要不要删除
动画的类型
1.平移动画: position  transform.translation.x transform.translation.y transform.translation.z
2.旋转动画: transform.rotation  transform.rotation.x   transform.rotation  transform.rotation.y
3.缩放动画: bounds  transform.scale  transform.scale.x  transform.scale.y
4.颜色动画:backgroundColor borderColor
5.淡入淡出:opacity
6.高级动画:(圆角)cornerRadius (边框) borderWidth (阴影)shadowOffse

CABaseAnimation选择其一 keyPath 作为例子
阴影动画

override func viewDidLoad() {
        super.viewDidLoad()
        redView.layer.shadowColor = UIColor.black.cgColor
        redView.layer.shadowOpacity = 0.5
        let animation = CABasicAnimation()
        animation.keyPath = "shadowOffset"
        animation.toValue = NSValue(cgPoint: CGPoint(x: 10, y: 10))
        animation.duration = 2.0
        animation.fillMode = kCAFillModeForwards
        animation.isRemovedOnCompletion = false
        redView.layer.add(animation, forKey: nil)
    }

CAKeyframeAnimation

新增几个属性
path:运动的路线
values: 关键帧(如果设置了 path,values 是被忽略的)
keyTimes:为对应的关键帧指定的时间点,范围是0~1的

    // 1.创建动画对象
    CAKeyframeAnimation * anim = [CAKeyframeAnimation animation];

    // 2.设置动画属性
    anim.keyPath = @"position";

    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddEllipseInRect(path, NULL, CGRectMake(100, 100, 200, 200));
    anim.path = path;
    CGPathRelease(path);

    // 动画的执行节奏
    anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
    anim.duration = 2.0f;
    anim.removedOnCompletion = NO;
    anim.fillMode = kCAFillModeForwards;
    anim.delegate = self;
    [self.redView.layer addAnimation:anim forKey:nil];

推荐阅读更多精彩内容

  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 7,180评论 6 28
  • 图层树 在UIKit中所有的视图都是基于UIView派生而来,UIView支持触摸时间,可以支持基于CoreGra...
    maguns阅读 956评论 1 3
  • 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你...
    Yiart阅读 3,060评论 3 34
  • 在iOS实际开发中常用的动画无非是以下四种:UIView动画,核心动画,帧动画,自定义转场动画。 1.UIView...
    请叫我周小帅阅读 2,473评论 1 23
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 4,211评论 5 12
  • 1. 同理心:情商是可以通过练习得到提升的,练习时投入的智商越大情商越高。 2. 自我认知:定期反省自己,每天找一...
    曲同宁阅读 80评论 0 0
  • 今天开始学习PPT制作,题目为梅花香自苦寒来
    Sailing3阅读 61评论 1 1
  • 谈成功经验,孩子更愿意跟你讲话,可以让他更自信。一个人遇到困境时最需要自信,让他看到自己有力量。他自己已有的成功经...
    语馨_f389阅读 57评论 0 0
  • 每每都看着别人的身材多好多美,每每都在看他人的举止多么优雅自如,每每都看别人怎么都那么优秀,当看到别人光鲜...
    君君成长日记阅读 211评论 0 0