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