IOS Animation-动画基础、深入
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-动画基础、深入的更多相关文章
- iOS核心动画(基础篇)
Core Animation相关内容基本介绍 此框架把屏幕上的内容组合起来,这个内容被分解成图层,放到图层树中,这个树形成了你能在应用程序看到的内容的基础 图层在iOS中就是CALayer类 当我们创 ...
- Swift 实现iOS Animation动画教程
这是一篇翻译文章.原文出处:http://www.raywenderlich.com/95910/uiview-animation-swift-tutorial 动画( animation)是iOS用 ...
- ios核心动画(基础动画)
一.简单介绍 CAPropertyAnimation的子类 属性解析: fromValue:keyPath相应属性的初始值 toValue:keyPath相应属性的结束值 随着动画的进行,在长度为du ...
- ios animation 动画效果实现
1.过渡动画 CATransition CATransition *animation = [CATransition animation]; [animation setDuration:1.0]; ...
- iOS核心动画(专用图层篇)
之前的文章我们了解了Core Animation中图层的一些基础知识.没有看过的传送门在此: iOS核心动画基础篇 那么在了解了这些基础知识之后,接下来进入专用图层的了解 苹果为了方便和性能,封装了几 ...
- 转 iOS Core Animation 动画 入门学习(一)基础
iOS Core Animation 动画 入门学习(一)基础 reference:https://developer.apple.com/library/ios/documentation/Coco ...
- iOS开发UI篇—核心动画(基础动画)
转自:http://www.cnblogs.com/wendingding/p/3801157.html 文顶顶 最怕你一生碌碌无为 还安慰自己平凡可贵 iOS开发UI篇—核心动画(基础动画) iOS ...
- 动画基础--基于Core Animation(2)
参考:https://zsisme.gitbooks.io/ios-/content/ 前面的文章动画基础--基于Core Animation(1)提到了图层的基本概念以及可动画参数几何学等知识. 本 ...
- iOS 核心动画 Core Animation浅谈
代码地址如下:http://www.demodashi.com/demo/11603.html 前记 关于实现一个iOS动画,如果简单的,我们可以直接调用UIView的代码块来实现,虽然使用UIVie ...
- iOS 动画基础总结篇
iOS 动画基础总结篇 动画的大体分类(个人总结可能有误) 分类.png UIView 动画 属性动画 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 ...
随机推荐
- linux下的触控板手势xSwipe and tag
这个最初是采用的touchegg.开始没有效果,后来网上发现是因为需要禁用系统的2指3指操作参考 http://askubuntu.com/questions/266057/cant-get-touc ...
- php memcache扩展 出现错误dyld: Symbol not found: _mmc_queue_free
mac 10.10 系统安装php memcache扩展 在使用memcache的时候出现错误dyld: Symbol not found: _mmc_queue_free需要重新编译memcache ...
- c++ chap1 to chap 3
#ifndef MAIN_H_INCLUDED#define MAIN_H_INCLUDED struct Course{ int id; std::string name;}; const int ...
- OD使用教程12
载入程序输入关键字: 双击进入程序 仔细看发现并没有跳转直接跳到这个mov,往上看发现retn上面有一个push,在这种编写手法当中这种组合相当于一个jmp, 跳到离它最近的一个值(在这就是004A5 ...
- OD使用教程3
reverseMe爆破: 跳转指令 让跳转已实现,把z的1改成0 按F8走,继续把z的1改成0,实现跳转 根据跳转指令,改变s或o,使跳转不实现 指令如上使跳转不实现 继续按f8往下走然后成功
- IntegerCache类
先看代码实例现象: 问题:为什么都是比较数值,第一个为true,第二个确为false呢? 查找源码(java.lang.Integer),看到如下代码: /** * Cache to support ...
- IIS服务的命令行方式重启命令
打开IIS配置窗口的CMD命令:开始---运行---CMD----输入inetmgr 直接使用CMD我们可以操作很多事情,比如启动IIS,重启IIS,停止IIS 重启IIS服务器,开始->运行- ...
- 比较C++和C#的一个性能问题
C++:只要你的代码正确,算法良好,你比较少关注性能问题,编译器会替你搞定绝大部分工作 C#:你的代码正确,算法良好,你还得用工具去分析优化性能,JIT为了快速工作,很多优化工作没有深入开展. 手工优 ...
- CreateCompatibleDC 与 CreateCompatibleBitmap 小小结
通常使用CreateCompatibleBitmap时候都会用到CreateCompatibleDC.而是用CreateCompatibleDC的目的不是为CreateCompatibleBitmap ...
- RHEL6p5下ntfs分区的挂载及自动挂载
No.1: #uname -a //查看你的Linux内核版本的命令 No.2:去http://www.atrpms.net/dist/el5/fuse/下载与内核接近的三个东西 fuse-libs- ...