zPosition属性
其实用到zPosition并不是因为学习CALayer,而是在很久的以前,使用[view bringSubviewToFront:view1];的时候,当时不知道是什么原因,一直起不了作用,最后大神告诉我。可以尔尔 view1.layer.zPosition = 1;就简单搞定了。因为layer其实是三维空间的,而不是简单的二维。而z轴的position初始值都是0.z轴的值越大,在图层的越上方......自行脑补吧......
CALayer是什么
CALayer(层)是屏幕上的一个矩形区域,在每一个UIView中都包含一个CALayer,CALayer负责UIView的视图显示。
Layer与UIView的关系
根据CALayer的定义,我们不难发现CALayer与UIView是一个包含关系,但是其中又不完全是包含关系。
以我个人的理解,大概可以这样描述。
UIView是对CALayer以及Response的一些封装,使得它具有除了视图显示之外的其他属性。比如它的子类UIButton具有点击操作,UIView本身有GestureRecognizer的一些操作。至于CALayer暴露给UIView的部分我们都可以用UIView来实现,比如说Frame
如下面的例子所示:使用view的layer属性,可以对view的frame进行更改。
当我们使用view.layer修改他的frame的时候,是这样的
事实上,我们对UIView的frame进行操作的时候,最终也是传输给layer进行具体操作的。也许你会觉得我们仅仅是修改了他的Layer的Frame,并UIView依旧是刚才那个CGRectMake(100,100,100,100);的frame。但是接下来我们给他加一个触摸事件看一下,我点击的部分我可以十份肯定不在CGRectMake(100,100,100,100)的区域,而在CGRectMake(100,100,200,200);的。但是它依然响应了触摸事件,我们知道CALayer是不能响应事件的,所以我们可以完全肯定,通过layer修改了view的frame。从而可以证明之前的包含和暴露结论
CALayer可以做什么
屡清楚了CALayer是什么之后,我们更迫切的想知道,它到底能做什么。
好吧,其实这个时候打开CALayer的.h文件比较靠谱,看看他都有哪些属性是UIView没有的,那就是没有暴露给UIView的,只有通过它自己才可以实现的。比如说这些
如果比较追求细节和技术的童鞋,就一条条的屡过去吧,总是会有收获的。
在github上的一份翻译上,我找到了对CALayer没有暴露给UIView的功能总结;
1,阴影,圆角,带颜色的边框
2,3D变换
3,非矩形范围
4,多级非线性动画。
好吧,接下来主要说一下我认为比较实用的一些属性。
cornerRadius
position
contents
borderWidth/borderColor
maskToBounds
contentRect
官方给的解释是这样的
/* A rectangle in normalized image coordinates defining the
* subrectangle of the `contents' property that will be drawn into the
* layer. If pixels outside the unit rectangles are requested, the edge
* pixels of the contents image will be extended outwards. If an empty
* rectangle is provided, the results are undefined. Defaults to the
* unit rectangle [0 0 1 1]. Animatable. */
大概意思就是说在layer中,我们可以通过这个属性,来显示它的局部内容。它的默认的大小是[0011],也就是显示全部。乍一看好像也没有太大的用处。但是这让我想起了刚学编码的时候一个盛大的大神给我晒的他们的UI图。大概是这个样子的,当然上面还有标注坐标,只是原图我已经找不到了。
运用这个属性,我们可以将APP需要载入的一些icon进行拼合,然后在显示的时候运用contentsRect进行切图,因为单张大图的载入速度,会比n张小图载入的速度快。(至于为什么,好吧我也不大懂,不过我想,n张小图就要做n次请求,而1张大图只要做一次请求,貌似是有那么点道理,就让我自己强行脑补一波吧)
至于使用,那就是非常简单了,只需要view.layer.contentsRect(0,0,0.5,0.5);类似这样,从左上角到右下角,0-1的一个坐标系。(0,0,1,1)就表示整张图都显示了。
anchorPoint
什么事anchorPoint?好吧,它就是一颗图钉,按住layer,让layer围着它转。这里需要说一点的是,这可图钉直接影响着view的位置。所以一般来说,都是先设置anchorePoint之后再设置frame.从而可以简单的让它不变形。