另类的视角看“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.

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

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

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

    CALayer直接继承 NSObject。

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

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

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

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

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

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

Step 5:UIView中可以添加子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实现,添加了响应事件的能力。

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

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

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

  

时间: 2024-10-11 09:23:25

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

[转]UIView 和 CALayer的那点事

(1)老祖 万物归根,UIView和CALayer都是的老祖都是NSObjet. 1: UIView的继承结构为: UIResponder : NSObject. 可以看出UIView的直接父类为UIResponder 类, UIResponder 是gsm的呢? 官方的解释: The UIResponder class defines an interface for objects that respond to and handle events. It is the superclass

【好程序员笔记分享】——UIView与CALayer详解

-iOS培训,iOS学习-------型技术博客.期待与您交流!------------ UIView与CALayer详解 研究Core Animation已经有段时间了,关于Core Animation,网上没什么好的介绍.苹果网站上有篇专门的总结性介绍,但是似乎原理性的东西不多,看得人云山雾罩,感觉,写那篇东西的人,其实是假 设读的人了解界面动画技术的原理的.今天有点别的事情要使用Linux,忘掉了ssh的密码,没办法重新设ssh,结果怎么也想不起来怎么设ssh远程登 陆了,没办法又到网上查

UIView与CALayer的区别,很详细

研究Core Animation已经有段时间了,关于Core Animation,网上没什么好的介绍.苹果网站上有篇专门的总结性介绍,但是似乎原理性的东西不多,看得人云山雾罩,感觉,写那篇东西的人,其实是假设读的人了解界面动画技术的原理的.今天有点别的事情要使用Linux,忘掉了ssh的密码,没办法重新设ssh,结果怎么也想不起来怎么设ssh远程登陆了,没办法又到网上查了一遍,太浪费时间了,痛感忘记记笔记是多么可怕的事情.鉴于Core Animation的内容实在是非常繁杂,应用的Obj-C语言

iOS开发——UIView与CALayer详解

UIView与CALayer详解 研究Core Animation已经有段时间了,关于Core Animation,网上没什么好的介绍.苹果网站上有篇专门的总结性介绍,但是似乎原理性的东西不多,看得人云山雾罩,感觉,写那篇东西的人,其实是假 设读的人了解界面动画技术的原理的.今天有点别的事情要使用Linux,忘掉了ssh的密码,没办法重新设ssh,结果怎么也想不起来怎么设ssh远程登 陆了,没办法又到网上查了一遍,太浪费时间了,痛感忘记记笔记是多么可怕的事情.鉴于Core Animation的内

iOS 中 UIView 和 CALayer 的关系

UIView 有一个名叫 layer ,类型为 CALayer 的对象属性,它们的行为很相似,主要区别在于:CALayer 继承自 NSObject ,不能够响应事件. 这是因为 UIView 除了负责响应事件 ( 继承自 UIReponder ) 外,它还是一个对 CALayer 的底层封装.可以说,它们的相似行为都依赖于 CALayer 的实现,UIView 只不过是封装了它的高级接口而已. 那 CALayer 是什么呢? CALayer(图层) 文档对它定义是:管理基于图像内容的对象,允许

UIView和CALayer的选择

UIView和CALayer的选择 如显示图片的层可以用一个UIImageView来实现. 既然CALayer和UIView都能实现相同的显示效果,那究竟该选择谁好呢? 其实,对比CALayer,UIView多了一个事件处理的功能.也就是说,CALayer不能处理用户的触摸事件,而UIView可以. 所以,在选择的过程中,需要考虑到实际的情况,如果显示出来的东西需要跟用户进行交互的话,用UIView:如果不需要跟用户进行交互,用UIView或者CALayer都可以 当然,CALayer的性能会高

UIView和CALayer的区别

1. UIView是iOS系统中界面元素的基础,所有的界面元素都是继承自它.它本身完全是由CoreAnimation来实现的.它真正的绘图部分,是由一个CALayer类来管理.UIView本身更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等,实际上内部都是在访问它所包含的CALayer的相关属性. 2. UIView有个重要属性layer,可以返回它的主CALayer实例. // 要访问层,读取UIView实例的layer属性 CALayer *

iOS:UIView的CALayer基本演练

UIView的CALayer基本演练的属性和注意事项: 在UIView中创建一个按钮UIButton,然后设置UIButton的Layer属性 –圆角.边框.阴影及3D形变属性 注意: 1.在UIView中CALayer只是一个类声明,因此需要添加QuartzCore框架(iOS7中已经不需要在导入了) 2.UIKit框架只能应用在iOS而不能用于Mac,但是Quartz 2D是可以跨平台的,因此在使用颜色时,不能直接使用UIColor而需要将颜色转成CGColor 3.修改图层相当于修改UIV

3D 视角看 Go 并发编程

主题:3D 视角看 Go 并发编程 Overview 并发编程综述 Goroutine Channel & Select & waitGroup 消息传递模式 可视化工具 GoTrace 主讲师:PP 先后在百度.第四范式.蚂蚁金服工作,百度 Go Good Coder, 对分布式计算.离线/实时大数据处理有丰富的实战经验.乐于分享自己的技术和学习心得. 一.并发编程综述 串行执行 并发与并行 多核时代的并发编程 左图:p1, p2, p3 这 3 个线程运行在单核上,分时复用 CPU,是