转载

另类的视角看“UIView”和“CALayer”——灵之于魄,男人之于肾的关系

清晨接连翻阅了几篇关于UIView和CALayer的博文,要么是上来一排排的代码(破坏了优雅的气氛),要么是题不达意(喂,what are you ‘写啥’ 嘞),看的我是雨里雾里,当然也有大牛辛辛苦苦的写的优秀文章,只是最近小编也正在学习“核心动画”,因为核心动画操作的对象不是UIView,而是CALayer,而对于二者那剪不断理还乱的关系 小编索性自己通过这篇博文整理了些粗浅的想法。

-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

iAronTalk Blog opens.

Perhaps happiness does not arrange the position, but succeeds must arrange the position.

-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

另类的视角看“UIView”和“CALayer”——灵之于魄,男人之于肾的关系

Step 1: 上帝创造世界万物时各物各归己位,“要风得风,要水的水,要人随即创造人”。想来,乔布斯创造OC时(开个玩笑,我知道不是他写的OC),不见得深谋远虑把每个部分设计完整归一吧,故而,我粗浅的认为当初UIView是UIView,CALayer是CALayer。那么问题来了,什么时候这两位碰的头,又什么时候纠缠在一起,怎么也撕扯不开的呢?这要从“开天辟地”说起。

Step 2 :UIApplication、UIViewController、UIView、和所有从UIView派生出来的UIKit类(包括UIWindow)都直接或间接地继承自UIResponder类。

CALayer直接继承 NSObject。

由此看见,UIView和CALayer本非同根生,若非要掰扯掰扯他们俩的是是非非,先要弄明白他们俩都为何物。

Step 3UIView ,大家的熟知程度想必这里说多了都是赘述了,就简单地介绍下TA吧。(UIView在屏幕上定义了一个矩形区域和管理区域内容的接口。在运行时,一个视图对象控制该区域的渲染,同时也控制内容的交互,所以说UIView具有三个基本的功能, 画图和动画,管理内容的布局,控制事件 。正是因为UIView具有这些功能,它才能担当起MVC中视图层的作用。)

CALayer ,对于大牛自然不在话下,手到擒来,只是对于小编这样的初出茅庐的小屁孩可是要煞费苦心的研究一把了。废话不多,让我们来认识一下CALayer君吧。(CALayer包含在QuartzCore框架中,这是一个跨平台的框架,既可以用在iOS中又可以用在Mac OS X中。在使用Core Animation开发动画的本质就是将CALayer中的内容转化为位图从而供硬件操作,其存在的重要意义在于 内容展示和动画操作。

那么知道了造物者的意思后,让我们来细致的品味一下二位的吧。

Step 4UIView 可以响应事件, CALayer = NO

UIView继承与UIResponder,在 UIResponder中定义了处理各种事件和事件传递的接口, 而 CALayer直接继承 NSObject,并没有相应的处理事件的接口。

Step 5UIView 中可以添加子View,即subview,其常用属性无外乎backgroundColor、frame、transform、bounds等等。

CALayer 中亦存在子父的阶级关系,即sublayer,除UIView的一些常规属性,CALayer还有一个叫anchorPoint的属性,它使用CGPoint结构,但是值域是0~1,也就是按照比例来设置。

Step 6: 由Step3可知:

UIView 侧重于对显示内容的管理, CALayer 侧重于对内容的绘制。

Step 7: 苹果官方文档中有这么一段话关于 UIView和CALayer 的话,正式开启了属于UIView和CALayer的篇章。

Displaying Layers in Views

Core Animation doesn't provide a means for actually displaying layers in a window, they must be hosted by a view. When paired with a view, the view must provide event-handling for the underlying layers, while the layers provide display of the content.

The view system in iOS is built directly on top of Core Animation layers. Every instance of  UIView automatically creates an instance of a CALayer class and sets it as the value of the view’s layer property. You can add sublayers to the view’s layer as needed.

此时的 CALayer与UIView演化为一种依存关系,发之于肤,血之于肉,灵之于魄,男人之于肾的关系

二者并非两套体系,UIView依赖与CALayer提供的内容,CALayer依赖UIView提供的容器来显示绘制的内容。

Step 8 :编者才疏学浅,固执的认为类的权威高于类中的属性(纯属宗族家长制思想),实则不然,二者并不能做简单地比较,但对于UIView和CALayer,编者却固执的认为属性化的CALayer应该时时刻刻服务于UIView,忠诚于它不离不弃,CALayer拥有的一切当归属于UIView(即由UIView来显示)。

Step 9有同行这样认为二者:UIView来自CALayer,高于CALayer,是CALayer高层实现与封装。UIView的所有特性来源于CALayer支持。归根到底CALayer是这一切的基础,如果没有CALayer,UIView自身也不会存在,UIView是一个特殊的CALayer实现,添加了响应事件的能力。

(上述综合看法,博主是赞同的,但在精神上鄙视)。

由于编者水平有限,不妥之处在所难免,恳请各个大牛批评指正,提出宝贵建议。

版权声明:本文为博主原创文章,未经博主允许不得转载。

正文到此结束
Loading...