从项目说起
说实话,UILayer就像alpha等于0.5一样,我始终有点不清晰的感觉。这种感觉大概源于其实项目上真正用到UILayer的地方不是特别多,有用到也只是用几个方法。而那些牛逼的大厂面试好像也看不起这个小小的layer,我们研究它呢就算纯粹的格物致知,了解事物根本原来。
什么是UILayer
那么回到了标题了,UILayer是什么鬼?答案是根本就没有UILayer,苹果官方文档,和我们平时用的其实都是CALayer。同时每个UIView里面都有一个layer属性,这就是让我们误认为是UILayer的东西。那么既然分开看就好说了,UIView继承于UIResponder,它主要管的其实是用户的反应那方面,CALayer集成于NSObject,苹果官方文档是这样解释的:
An object that manages image-based content and allows you to perform animations on that content.
翻译过来的意思就是-----管理基于图像的内容的对象,允许您对该内容执行动画。动画方面我们此处不表,我们主要研究下管理基于图像的内容的对象。
如何管理基于图像的对象
我们都知道你给一个UIView弄个绿色也就算图像了,那我直接UIView.frame就能更改位置大小了啊,我UIView.backgroundColor就算更改图像颜色啦,和你一个CALayer有一分钱关系没有?其实UIView只是CALayer的一个代理,你UIView的这些方法其实都只是CALayer的代理方法。啥?你说我扯淡?好,我们看苹果官方文档上的话:
If the layer object was created by a view, the view typically assigns itself as the layer’s delegate automatically, and you should not change that relationship. For layers you create yourself, you can assign a delegate object and use that object to provide the contents of the layer dynamically and perform other tasks. A layer may also have a layout manager object (assigned to the layoutManager property) to manage the layout of subviews separately.
这段话就不翻译了,其实翻译过来就是我上面说的意思,UIView其实没你想的那么牛逼,其实它本职工作就是响应响应用户事件,凡是眼睛看到的东西基本都是封装在CALayer里面的,不信你看这些方法hitTest,hidden,mask,其实都是CALayer的方法。这就和我开头所写的有了悖论,我们不是平时工作中用不到它,而是用的太频繁了,但是它太低调导致我们有时候误认为一切都是UIView的功劳,它才是
事了拂衣去,深藏功与名
那么就让我们以后继续愉快的使用它吧