ios之CoreAnimation
CoreAnimation的好处:
1.高性能,简单的编程模块
2.像View一样,使用层级结构来构建负责的界面
3.轻量级数据结构,能使上百个动画同时执行
4.抽象的动画接口,允许动画在一个独立的线程中运行,独立于应用程序的run loop
5.提高应用程序的性能
6.可扩展的布局管理模型
CoreAnimation Class:
1.Layer Class:提供显示内容
2.Animation and timing Class
Layer的许多属性都有隐式的动画效果,改变属性值将会自动产生一个从当前值到新值的动画
显示的动画不会改变Layer的属性,它只负责显示动画
CAAnimation是所有动画类的抽象类,具体类有以下几种
- CATransition过渡效果
- CAAnimationGroup多个动画同时执行
- CAPropertyAnimation抽象类,支持key path
- CABasicAnimation简单的修改layer的属性
- CAKeyframeAnimation支持key frame动画
3.Layout and constraint classes
4. Transaction class
CoreAnimation支持2种形式的Transaction:
- implicit transactions:当layer的属性修改,如果layer thread中没有activity的transaction时,自动创建,在线程的下个run loop中自动的提交
- Explicit transaction:CATransaction begin时开始,commit时结束
CoreAnimation的渲染结构
layer是MVC中的model对象。它封装几何,时间,可现实属性,和显示的内容。但它并不负责实际的显示。
Layer-Tree包含你设定的属性值
Presentation Tree中的值是当前正在执行动画的属性值
Render-Tree使用Presentation tree中的值,Render-Tree负责实际的渲染操作,独立于应用程序的activity。渲染是在一个独立的进程或线程中执行的。
当动画正在执行时,我们可以通过查询layer的Presentation Tree,通过这我们能够修改当前正在执行的动画
Layer的几何特性和变换
这里需要注意的是layer的bounds属性,bounds的origin用于:当你重写layer的draw方法时,它指定当前图形上下文的origin,修改origin时,代表layer的左下角的坐标改变了,不再是(0,0)了,而变成(origin.x, origin.y),如果在draw方法中从(0,0)开始绘图,此时将只有部分绘图能显示出来,因为你是从layer以外的部分开始绘制的。注意,UIView的origin是在左上角。
有以下几种方式修改layer的CATransform3D:
- 使用CATransform3D方法
- 直接修改其数据结构的成员
- 使用key-value coding和key paths
注意
You can not specify a structure field key path using Objective-C 2.0 properties. This will not work:
myLayer.transform.rotation.x=0; |
Instead you must use setValue:forKeyPath:
or valueForKeyPath:
as shown below:
[myLayer setValue:[NSNumber numberWithInt:0] forKeyPath:@"transform.rotation.x"]; |
Layer Tree Hierarchy
默认,从Layer Tree中插入或移除layer时,会触发动画:
- 当layer加到parent layer时,parent layer会触发一个动作(动作标识符为kCAOnOrderIn)
- 当layer从parent layer移除时,parent layer会触发动作(kCAOnOrderOut)
- 当replace时,parent layer会触发kCATransition动作
可以禁用这些动画,或者通过标识符来修改这些动画
注意masksToBounds属性,当它设置为YES时,会将子layer超出父layer的部分剪切掉
Providing Layer Content
在UIVew中我们可以子类化或者执行drawRect:方法来显示内容
但在CALayer中可以直接指定其内容,因为CALayer是一个键值编码的容器,我们可以在其中添加任意值,来避免子类化
主要有以下几种方式:
- 显示的设置contents属性
- 指定delegate提供或者直接draw出来(
displayLayer:
ordrawLayer:inContext:
),执行代理方法时,layer不会自动的去draw,必须要执行setNeedsDisplay
orsetNeedsDisplayInRect:,或者设置needsDisplayOnBoundsChange
为YES。 - 子类化,并重写它的显示内容方法
Animation
开始执行显示动画: addAnimation:forKey:
结束显示动画:1.动画完成;2.removeAnimationForKey: 3.removeAllAnimations
临时关闭隐式动画:
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
forKey:kCATransactionDisableActions];
[aLayer removeFromSuperlayer];
[CATransaction commit];
Layer Action
layer action在以下情况下会被触发:添加layer或者移除layer,layer的属性被修改,或者是显示的应用程序请求。
默认情况,触发action时,会产生一个动画效果
ios之CoreAnimation的更多相关文章
- iOS开发CoreAnimation解读之三——几种常用Layer的使用解析
iOS开发CoreAnimation解读之三——几种常用Layer的使用解析 一.CAEmitterLayer 二.CAGradientLayer 三.CAReplicatorLayer 四.CASh ...
- iOS开发CoreAnimation解读之一——初识CoreAnimation核心动画编程
iOS开发CoreAnimation解读之一——初识CoreAnimation核心动画编程 一.引言 二.初识CoreAnimation 三.锚点对几何属性的影响 四.Layer与View之间的关系 ...
- iOS开发CoreAnimation解读之二——对CALayer的分析
iOS开发CoreAnimation解读之二——对CALayer的分析 一.UIView中的CALayer属性 1.Layer专门负责view的视图渲染 2.自定义view默认layer属性的类 二. ...
- iOS关于CoreAnimation动画知识总结
一:UIKit动画 在介绍CoreAnimation动画前先简单介绍一下UIKit动画,大部分简单的动画都可以使用UIKit动画实现,如果想实现更复杂的效果,则需要使用Core Animation了: ...
- iOS动画——CoreAnimation
CoreAnimation在我之前的UIKit动画里面简单的提了一句CoreAnimation动画,其实大家别看它类库名种有个animation,实际上animation在这个库中只占有很小的地位. ...
- CALayer的分析
转载地址: http://my.oschina.net/u/2340880/blog/536048 iOS开发CoreAnimation解读之二——对CALayer的分析 一.UIView中的CAL ...
- CAAnimation-CAPropertyAnimation-CABasicAnimation-CAKeyframeAnimation
参考博客 iOS关于CoreAnimation动画知识总结 http://www.cnblogs.com/wujy/p/5203995.html iOSCoreAnimation动画系列教程(一):C ...
- iOS CoreAnimation详解(一) 有关Layer的动画
以前由于项目需要 也写了一些动画 ,但是知识不系统,很散.这段时间趁着项目完成的空袭,来跟着大神的脚步系统的总结一下iOS中Core Animation的知识点. 原博客地址:http://blog. ...
- iOS CoreAnimation 核心动画
一 介绍 一组非常强大的动画处理API 直接作用在CALAyer上,并非UIView(UIView动画) CoreAnimation是所有动画的父类,但是不能直接使用,应该使用其子类 属性: dura ...
随机推荐
- 利用python进行数据分析之pandas入门
转自https://zhuanlan.zhihu.com/p/26100976 目录: 5.1 pandas 的数据结构介绍5.1.1 Series5.1.2 DataFrame5.1.3索引对象5. ...
- UFLDL教程
http://ufldl.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B
- EasyNVR+EasyDSS实现简单套路的RTMP、微信直播、录像、回放方案
安防领域HLS直播问题探讨 近期外出交流比较多,在之前的一篇博客<一种流量成本节省60%以上的手机直播微信直播H5直播幼儿园直播方案>我们说到了一种模式,就是当我们在做最近火热的幼儿园直播 ...
- EasyNVR H5直播流媒体解决方案前端构建之:如何播放自动适配RTMP/HLS直播播放
之前在进行EasyNVR多屏开发的时候,由于多屏功能不需要在手机端展示出来(pc多播放为RTMP,手机端播放为HLS),因此只注意到了引用videojs来进行rtmp的播放.由于不同项目需求不同,对h ...
- EasyNVR RTSP转RTMP-HLS流媒体服务器前端构建之:通过接口获取实时信息
对于动态网站,要实时更新网站的信息,通过接口来获取实时信息是一个必不可少的部分.EasyNVR可以接入IPC等前端设备,必须要实时获取到对应的IPC实时信息进行展示. 本篇主要说明Ajax来获取数据. ...
- android菜鸟学习笔记13----Android控件(二) 自定义控件简单示例
有时候,可能觉得系统提供的控件太丑,就会需要自定义控件来实现自己想要的效果. 以下主要参考<第一行代码> 1.自定义一个标题栏: 系统自带的标题栏很丑,且没什么大的作用,所以我们之前会在o ...
- git config --system --unset credential.helper 重新输入账号密码
检查本地配置$ git config --local -lcore.repositoryformatversion=0core.filemode=falsecore.bare=falsecore.lo ...
- MySQL 中事务的实现
在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的: 在这篇文章中,我们将对事务的实现进行分析, ...
- STL容器元素应满足的条件
要使用C++中的标准模板库中的容器,其元素要满足以下三个条件: 元素必须可以通过copy构造函数进行复制,且二者进行相等测试返回true. 元素必须可以通过赋值操作符完成赋值操作. 元素必须可以通过析 ...
- 在Linux下创建7种类型的文件
在测试的时候有时会需要每种类型的文件,在系统中进行搜索都会找到,当然最方便的还是手动创建它们进行测试使用. 普通文件: $ touch regular 目录: $ mkdir directory 符号 ...