iOS中Layer的认识和使用

来源:互联网 发布:k核分析 社会网络 编辑:程序博客网 时间:2024/05/21 11:35

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)就表示整张图都显示了。


zPosition属性

其实用到zPosition并不是因为学习CALayer,而是在很久的以前,使用[view bringSubviewToFront:view1];的时候,当时不知道是什么原因,一直起不了作用,最后大神告诉我。可以尔尔 view1.layer.zPosition = 1;就简单搞定了。因为layer其实是三维空间的,而不是简单的二维。而z轴的position初始值都是0.z轴的值越大,在图层的越上方......自行脑补吧......


anchorPoint

什么事anchorPoint?好吧,它就是一颗图钉,按住layer,让layer围着它转。这里需要说一点的是,这可图钉直接影响着view的位置。所以一般来说,都是先设置anchorePoint之后再设置frame.从而可以简单的让它不变形。





2 0
原创粉丝点击