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. struts2一些概念介绍和标签的使用

    依赖注入 模块包含 struts.xml的模块包含格式 <include file="xx.xml" > OGNL 对象导航语言   有个超大的好处就是根据对象访问属性 ...

  2. c# 筛选进程命令行,得其ProcessId(唯一标示符,简称pid),再通过pid结束进程

    不说别的,上代码 部分using: using System.Diagnostics; using System.Management; 其中要引用System.Management 1.通过筛选Co ...

  3. Tomcat7下出现The requested resource(/)is not available

    1首先确保你的localhost是否正常运行解决方案:1观察项目是否部署2重新将tomcat7导入 2确保你的项目名后跟index.jsp是否正常运行解决方案:1右键项目名,web进行查询,观察部署的 ...

  4. ulipad源码包配置环境及安装

    一.准备下载的安装包: 1.python(我电脑配置的是2.7)下载地址http://pan.baidu.com/s/1qWrGZk4 2.wxpython(我这里是wxpy3.0,配套python2 ...

  5. Taylor定理证明

    下图,单独打开查看 当n->inf时如果 Rn(c)趋0, c属于(a,x), 那么在区间(a,x) 内函数在a点生成的taylor级数收敛到函数f.

  6. Unity4升级Unity5后Image Effects问题

    Assets\Editor\Image Effects\CameraMotionBlurEditor.js 会出现Ambiguous reference 'preview'错误提示,解决方法 查找pr ...

  7. 『TCP/IP详解——卷一:协议』读书笔记——16

    2013-08-26 22:50:54 6.4 ICMP时间戳请求与应答 ICMP时间戳请求允许系统向另一个系统查询当前的时间.返回的建议值是自午夜开始计算的毫秒数(协调的统一时间,Coordinat ...

  8. DECLARE_GLOBAL_DATA_PTR宏定义问题

    最近闲着顺便看了看6410的uboot代码,因为友善的boot对nand部分代码做了隐藏,所以干脆找了光盘里面三星原厂的uboot代码来看,因为友善的boot代码肯定也是基于厂商的代码改的,肯定可以的 ...

  9. 初探Lambda表达式

    简单例子 Expression<Func<; 了解Net方法,没有比IL来得更加容易.反编译IL代码如下(截取部分显示) [] <<int32, bool>> ex ...

  10. reduce() 函数

    reduce()函数 reduce()函数也是Python内置的一个高阶函数.reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传 ...