iOS核心动画高级技巧--(一)图层树

Core Animation其实是一个令人误解的命名。你可能认为它只是用来做动画的, 但实际上它是从一个叫做Layer Kit这么一个不怎么和动画有关的名字演变而来,所 以做动画这只是Core Animation特性的冰山一角。
Core Animation是一个复合引擎,它的职责就是尽可能快地组合屏幕上不同的可视内容,这个内容是被分解成独立的图层,存储在一个叫做图层树的体系之中。于是这个树形成了UIKit以及在iOS应用程序当中你所能在屏幕上看见的一切的基础。
在我们讨论动画之前,我们将从图层树开始,涉及一下Core Animation的静态组 合以及布局特性。

1.1 图层与视图

一个视图就是在屏幕上显示的一个矩形块(比如图片,文字或者视频),它 能够拦截类似于鼠标点击或者触摸手势等用户输入。视图在层级关系中可以互相嵌 套,一个视图可以管理它的所有子视图的位置。

iOS当中,所有的视图都从一个叫做UIVIew的基类派生而来, UIView 可以 处理触摸事件,可以支持基于Core Graphics绘图,可以做仿射变换(例如旋转或 者缩放),或者简单的类似于滑动或者渐变的动画。

CALayer

CALayer 类在概念上和UIView类似,同样也是一些被层级关系树管理的矩形块,同样也可以包含一些内容(像图片,文本或者背景色),管理子图层的位置。 它们有一些方法和属性用来做动画和变换。UIView 最大的不同是 CALayer 不 处理用户的交互。

平行的层级关系

每一个 UIview都有一个 CALayer实例的图层属性,也就是所谓的backing layer,视图的职责就是创建并管理这个图层,以确保当子视图在层级关系中添加或 者被移除的时候,他们关联的图层也同样对应在层级关系树当中有相同的操作

实际上这些背后关联的图层才是真正用来在屏幕上显示和做动画, UIView 仅仅 是对它的一个封装,提供了一些iOS类似于处理触摸的具体功能,以及Core Animation底层方法的高级接口。

图层的能力

如果说 CALayerUIView 内部实现细节,那我们为什么要全面地了解它呢? 苹果当然为我们提供了优美简洁的 UIView 接口,那么我们是否就没必要直接去处理Core Animation的细节了呢?
某种意义上说的确是这样,对一些简单的需求来说,我们确实没必要处理 CALayer ,因为苹果已经通过 UIView的高级API间接地使得动画变得很简单。
但是这种简单会不可避免地带来一些灵活上的缺陷。如果你略微想在底层做一些改变,或者使用一些苹果没有在UIView上实现的接口功能,这时除了介入Core Animation底层之外别无选择。
我们已经证实了图层不能像视图那样处理触摸事件,那么他能做哪些视图不能做 的呢?这里有一些 UIView没有暴露出来的CALayer的功能:

  • 阴影,圆角,带颜色的边框 3D变换
  • 非矩形范围
  • 透明遮罩
  • 多级非线性动画
    我们将会在后续章节中探索这些功能,首先我们要关注一下在应用程序当中 CALayer是怎样被利用起来的。
使用图层

之后就可以在代码中直接引用 的属性和方法。我们用创 建了一个,设置了它的 属性,然后添加到了背后相关图层的子图层(这段代码的前提是通过IB创建 并做好了连接)

- (void)viewDidLoad
{
    [super viewDidLoad];
    //create sublayer
    CALayer *blueLayer = [CALayer layer];
    blueLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f);
    blueLayer.backgroundColor = [UIColor blueColor].CGColor;
    //add it to our view
    [self.layerView.layer addSublayer:blueLayer];
}

一个视图只有一个相关联的图层(自动创建),同时它也可以支持添加无数多个子图层,你可以显示创建一个单独的图层,并且把它直接添加到视图关联图层的子图层。尽管可以这样添加图层,但往往我们只是简单地处理视图,他们关联的图层并不需要额外地手动添加子图层。

使用图层关联的视图而不是CALayer的好处在于,你能在使用所有CALayer 底层特性的同时,也可以使用UIView的高级API(比如自动排版,布局和事件处理)。
然而,当满足以下条件的时候,你可能更需要使用 CALayer 而不是 UIView:

  • 开发同时可以在Mac OS上运行的跨平台应用
  • 使用多种的子类,并且不想创建额外的 UIView去包封装它们所有
  • 做一些对性能特别挑剔的工作,比如对 UIView一些可忽略不计的操作都会引起显著的不同(尽管如此,你可能会直接想使用OpenGL绘图)
    但是这些例子都很少见,总的来说,处理视图会比单独处理图层更加方便。
总结

这一章阐述了图层的树状结构,说明了如何在iOS中由 UIView的层级关系形成 的一种平行的 CALayer层级关系,在后面的实验中,我们创建了自己的 ,并把它添加到图层树中。

iOS核心动画高级技巧--目录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容