文章分享至个人我的博客: https://cainluo.github.io/14770254062641.htmlhtml
最近做者一直有一些迷糊, 感受在研究上有了一些迷糊, 不知道怎么往下研究了, 咨询了一下朋友和一些前辈, 决定先玩一玩Core Animation, 毕竟是iOS的核心层之一, 也是最吸引人的地方之一, 今天就让咱们先来了解一下Core Animation的一些概念知识. 最后: 若是你有更好的建议或者对这篇文章有不满的地方, 请联系我, 我会参考大家的意见再进行修改, 联系我时, 请备注
Core Animation
若是以为好的话, 但愿你们也能够打赏一下~嘻嘻~祝你们学习愉快~谢谢~git
- Core Animation是iOS与OS X平台上负责图形渲染与动画的基础设施。
- Core Animation能够动画视图和其余的可视元素。
- Core Animation为你完成了实现动画所需的大部分绘帧工做。
- 你只需在配置少许的动画参数(如开始点位置和结束点位置)就可启动Core Animation。
- Core Animation将大部分实际的绘图任务交给了图形硬件处理,图形硬件会加速图形渲染的速度。
- 这种自动化的图形加速让动画具备更高的帧率且更加平滑,但这并不会增长CPU的负担而致使影响你应用的运行速度。
在咱们平常开发iOS或者是Mac应用中, 咱们都避免不了对UI的布局(否则要UI设计师干吗), 那咱们通常是怎么去看应用中的图层结构呢? 让咱们直接来看一个Demo吧.微信
建立一个新的项目, 而后在项目当中随意添加一个或者多个UI控件.app
运行了项目以后, 找到查看图层的按钮, 点击以后就会跳转到查看图层的界面.ide
再换个角度看看~~模块化
在iOS当中, 不管是神马UIButton,UIScrollView, 仍是神马UITableView, 都是基于UIView基类派生而来的, 而UIView是能够处理Touch事件, 也支持Core Graphics的绘画, 也能够作仿射变换(也就是神马旋转, 缩放事件), 固然, 也能够作相似于滑动, 渐变等UIView基础动画.布局
CALayer实际上是和UIView的概念差很少, 也是一样被层级关系树所管理, 也同样有神马图片, 文本, 背景色等内容, 或者是管理一些子图层等等, 但CALayer和UIView最大的区别是在于,CALayer并不能处理用户交互, 即便CALayer提供了一些方法来判断触点是否在图层的范围以内.性能
用过UIView的朋友们其实都知道, 每个UIView当中都有一个CALayer实例的图层属性, 也就是所谓backing layer.学习
UIView的职责是用来建立并管理这个图层, 以确保层级关系中添加或者被移除的时候, 所关联的Layer也会有一样的操做.
虽然UIView是做为一个管理者, 但实际上显示在屏幕上以及作动画效果的都是Layer,UIView仅仅只是对Layer的一个封装, 提供了一些而外的方法, 好比Touch的功能,Core Animation底层方法的高级API, 因此UIView和CALayer是处于一个平级的关系.
说到这里, 就会有一个疑惑, 为何苹果要把UIView和CALayer处于一个平级的关系呢?(或许有人会有这样子的疑问)
其实缘由很简单, 是为了职责分离, 也算是模块化划分吧, 由于在Mac OS当中, 并无UIView这个类, 因此并不能处理Touch事件, 但却有CALayer, 因此苹果为了可以让Mac OS和iOS两个系统相互共享代码, 直接把CALayer给独立出来了~~
其实在系统库当中, 苹果已经经过UIView提供了许多高级的API, 间接的使得动画变得很简单.
但这样子就带来另外的一个问题, 就是灵活性的缺失, 打个比方, 若是你想在底层作一些额外的操做, 经过系统提供的API是无法实现的, 这个时候, 咱们除了去学习和了解Core Animation以外, 再也没有其余途径了.
那么说到底,CALayer到底能用来作什么呢? 有好几个点, 好比:
- 阴影, 圆角, 边框
- 3D变换(好比拉伸, 放大, 缩小等)
- 非矩形范围
- 透明遮罩
- 多级非线性动画
大体上就这一些, 后续咱们会经过学习Core Animation, 会了解更多的Layer, 以及怎么利用Layer作出咱们想作的效果.
通常来说, 在咱们平常开发中, 都是面对视图开发, 但若是某些特殊的场景, 咱们仍是须要面向CALayer来进行开发的, 好比
- 开发一个可同时在Mac OS和iOS两个平台上使用的应用
- 使用多种的CALayer子类, 而且不想建立一个UIView去封装它们
- 作一些对性能特别挑剔的工做(暂时我也没想到, 知道的朋友能够和我说说)
但总的来讲, 直接面向视图开发, 要比面向CALayer开发的要简单.
说了那么多东西, 其实重点就那么几个:
- CALayer与UIView是平级关系
- CALayer与UIView的相同点与区别
- CALayer可跨平台使用
- CALayer不可以响应事件
- UIView是基于CALayer封装的一个类, 并提供Touch事件
项目地址: https://github.com/CainRun/CoreAnimation