1. Model Layer Tree(模型层树)和Presentation Layer Tree(表示层树)

CALayer是动画产生的地方。当我们动画添加到Layer时,是不直接修改layer的属性的。所以CoreAnimation有两个layer层次结构:model layer tree(模型层树)和presentation layer tree(表示层树)。Model Layer Tree的Layers是我们直接看到layers的状态,Presentation Layer Tree的Layers是动画正在表现的值的近似。

我们可以这样来调用:

 //模型层树
CALayer.modelLayer(CALayer)
//表示层树
CALayer.presentationLayer(CALayer)

例如,我们运行一个动画改变position.x的值,让Layer由左向右运动(如下图)。

我们发现在运动结束后,Layer会还原回原来的值。这是因为在默认情况下,动画在运行结束后,不会修改其Presentation Layer,也就是说,结束时会彻底移除Presentation Layer。通俗的来说,运行结束时Presentation Layer会回到Model Layer的值。

如果想动画运行结束后还保留其结束后的值,则有下面两种方法可以修改。

1)通过结束后的值来设置Layer的位置(推荐这种,因为这种方法使得动画完全可选)

     //移动动画position
func addLayerAnimationPosition(layer: CALayer) {
let animation = CABasicAnimation(keyPath: "position")
animation.fromValue = NSValue(CGPoint: layer.position)
//移动到的位置
animation.toValue = NSValue(CGPoint: CGPointMake(, ))
animation.duration = layer.addAnimation(animation, forKey: "addLayerAnimationPosition") //设置Layer结束后的位置
layer.position = CGPointMake(, )
}

2)通过kCAFillModeForward和removedOnCompletion防止结束时被移除

     //移动动画position
func addLayerAnimationPosition(layer: CALayer) {
let animation = CABasicAnimation(keyPath: "position")
animation.fromValue = NSValue(CGPoint: layer.position)
//移动到的位置
animation.toValue = NSValue(CGPoint: CGPointMake(, ))
animation.duration =
//运动后的位置保持不变
animation.removedOnCompletion = false
animation.fillMode = kCAFillModeForwards layer.addAnimation(animation, forKey: "addLayerAnimationPosition")
}

我们可以看到,从上面的方法可以得到动画结束后不变,但是请注意的一点是这样会造成额外的开销,因为渲染器回去进行额外的绘画工作。

2.动画的beginTime与被复制性

动画当被添加到Layer时,Layer会复制这份动画。这使我们在多个view中重用同一个动画非常有用。比如我们创建一个Layer的动画由左向右运动,当运动完成时在过1秒钟,此Layer会变透明。

         //----------先由左向右运动,然后边透明-----------
//添加由左向右的动画
let ani = CABasicAnimation.init(keyPath: "position.x")
ani.toValue =
ani.duration =
ani.removedOnCompletion = false
ani.fillMode = kCAFillModeForwards
calayer.addAnimation(ani, forKey: "position_x") //上面的动画执行时,已经被layer copy一份了,所以要想改变animation的值不会影响其动画效果
//重用上面的动画,当运动完成后+3秒,执行下一动画——变透明
ani.keyPath = "opacity"
ani.beginTime = CACurrentMediaTime() +
ani.toValue =
calayer.addAnimation(ani, forKey: "opacity")

如果想了解动画与bezier曲线与layer的结合,可以看CAShapeLayer、UIBezierPath与Animation的结合

IOS Animation-动画基础、深入的更多相关文章

  1. iOS核心动画(基础篇)

    Core Animation相关内容基本介绍 此框架把屏幕上的内容组合起来,这个内容被分解成图层,放到图层树中,这个树形成了你能在应用程序看到的内容的基础 图层在iOS中就是CALayer类 当我们创 ...

  2. Swift 实现iOS Animation动画教程

    这是一篇翻译文章.原文出处:http://www.raywenderlich.com/95910/uiview-animation-swift-tutorial 动画( animation)是iOS用 ...

  3. ios核心动画(基础动画)

    一.简单介绍 CAPropertyAnimation的子类 属性解析: fromValue:keyPath相应属性的初始值 toValue:keyPath相应属性的结束值 随着动画的进行,在长度为du ...

  4. ios animation 动画效果实现

    1.过渡动画 CATransition CATransition *animation = [CATransition animation]; [animation setDuration:1.0]; ...

  5. iOS核心动画(专用图层篇)

    之前的文章我们了解了Core Animation中图层的一些基础知识.没有看过的传送门在此: iOS核心动画基础篇 那么在了解了这些基础知识之后,接下来进入专用图层的了解 苹果为了方便和性能,封装了几 ...

  6. 转 iOS Core Animation 动画 入门学习(一)基础

    iOS Core Animation 动画 入门学习(一)基础 reference:https://developer.apple.com/library/ios/documentation/Coco ...

  7. iOS开发UI篇—核心动画(基础动画)

    转自:http://www.cnblogs.com/wendingding/p/3801157.html 文顶顶 最怕你一生碌碌无为 还安慰自己平凡可贵 iOS开发UI篇—核心动画(基础动画) iOS ...

  8. 动画基础--基于Core Animation(2)

    参考:https://zsisme.gitbooks.io/ios-/content/ 前面的文章动画基础--基于Core Animation(1)提到了图层的基本概念以及可动画参数几何学等知识. 本 ...

  9. iOS 核心动画 Core Animation浅谈

    代码地址如下:http://www.demodashi.com/demo/11603.html 前记 关于实现一个iOS动画,如果简单的,我们可以直接调用UIView的代码块来实现,虽然使用UIVie ...

  10. iOS 动画基础总结篇

    iOS 动画基础总结篇   动画的大体分类(个人总结可能有误) 分类.png UIView 动画 属性动画 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 ...

随机推荐

  1. depot用例视图建模

    1. 确定系统涉及的内容 图书馆管理系统有以下模块构成:系统登陆模块.图书馆管理模块.学生管理模块.借阅信息管理模块.图书检索模块. 2. 分析系统参与者 确定参与者首先分析系统涉及的问题领域 和 系 ...

  2. LeetCode OJ-- Single Number II **@

    有一列数,其中有1个数出现了1次,其它数都出现了3次,求这个数. class Solution { public: int singleNumber(int A[], int n) { ) ; ; ; ...

  3. Stack Overflow is a question and answer site

    http://stackoverflow.com/ _ Stack Overflow is a question and answer site for professional and enthus ...

  4. C# 加密

    一.RSA加密解密 using System; using System.Collections.Generic; using System.IO; using System.Linq; using ...

  5. 从MyEclipse转战到IntelliJ IDEA的经历

    从MyEclipse转战到IntelliJ IDEA的经历 我一个朋友写了一篇"从Eclipse到Android Studio"博文,于是心潮澎湃我也想一篇,分享自己用这个IDEA ...

  6. js生成验证码并检验

    <html> <head> <title>验证码</title> <style type="text/css"> #co ...

  7. hdu acm 1028 数字拆分Ignatius and the Princess III

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  8. src与 href 的一些区别

    src用于替换当前元素,href用于在当前文档和引用资源之间确立联系. src 是 source 的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置:在请求 src 资源时会将其指 ...

  9. ubuntu下面mysql,通过载入txt文件初始化数据表

    环境:ubuntu12.04   mysql(通过apt安装) (1)根据数据表中的属性列,对应在txt中构造记录(一行对应一条记录),不同属性之间通过tab键(以/root目录下构建的init.tx ...

  10. 查看上下文切换的多的进程(find which process take the most context switch)

    这是原文链接http://serverfault.com/questions/190049/find-out-which-task-is-generating-a-lot-of-context-swi ...