UIView,UIWindow,CALayer之间的区别联系

UIView,UIWindow,CALayer之间的区别联系

UIView是视图的基类,UIViewController是视图控制器的基类,UIResponder是表示一个可以在屏幕上响应触摸事件的对象;

UIwindow是UIView的子类,UIWindow的主要作用:一是提供一个区域来显示UIView,二是将事件(event)的分发给UIView,一个应用基本上只有一个UIWindow.

万物归根,UIView和CALayer都是的老祖都是NSObjet。可见UIResponder是用来响应事件的,也就是UIView可以响应用户事件。

一.继承结构

  • 1: UIView的继承结构为: UIResponder : NSObject

UIResponder是用来响应事件的,也就是UIView可以响应用户事件

  • 2:CALayer的继承结构为:NSObject。

直接从NSObject继承,没有UIResponder类,所以CALayer不能响应任何用户事件。

二.所属框架

  • 1:UIView是在 /System/Library/Frameworks/UIKit.framework中定义的。

  • 2:CALayer是在/System/Library/Frameworks/QuartzCore.framework定义的。而且CALayer作为一个低级的,可以承载绘制内容的底层对象出现在该框架中。

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

三.相似

  • 1:相似的树形结构

  • 2:显示内容绘制方式

  • 3: 布局约束

四.其它区别

  • 1、UIView是IOS系统中界面元素的基础,所有的界面元素都继承自它。它本身完全是由CoreAnimation来实现的(Mac下似乎不是这样)。它真正的绘图部分是由一个叫CALayer(Core Animation Layer)的类来管理。UIView本身,更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等等,实际上内部都是在访问它所包含的CALayer的相关属性。

  • 2、UIView有个layer属性,可以返回它的主CALayer实例,UIView有一个layerClass类方法,返回主layer所使用的类,UIView的子类,可以通过重载这个方法,来让UIView使用不同的CALayer来显示。

  • 3、UIView的CALayer类似UIView的子View树形结构,也可以向它的layer上添加layer,来完成某些特殊的表示。

例如下面的代码:

1
2
3
4
5
CALayer *grayLayer=[[CALayer alloc] init];
grayLayer.backgroundColor=[[[UIColor redColor]
colorWithAlphaComponent:1.0]
CGColor];
[self.view.layer addSublayer:grayLayer];

会在目标View上敷上一层红色的透明薄膜。

  • 4、UIView的layer树形在系统内部,被系统维护着三份copy(这里的理解可能不准确)

第一份,逻辑树,就是代码里可以操纵的,例如更改layer的属性等等就在这一份。

  • 第二份,动画树,这是一个中间层,系统正在这一层上更改属性,进行各种渲染操作。

  • 第三份,显示树,这棵树的内容是当前正被显示在屏幕上的内容。 这三棵树的逻辑结构都是一样的,区别只有各自的属性。

  • 5、动画的动作UIView的主layer以外(觉得是这样),对它的subLayer,也就是子layer的属性进行更改,系统将自动进行动画生成,动画持续时间有个缺省时间,感觉大概是0.5秒。在动画时间里,系统自动判断哪些属性更改了,自动对更改的属性进行动画插值,生成中间帧,然后连续显示产生动画效果。

  • 6、坐标系系统(对position和anchorPoint的关系不是很清楚)

CALayer的坐标系系统和UIView有点不一样,它多了一个叫anchorPoint的属性,它使用CGPoint结构,但值域是0至1,也就是按比例来设置的。这个点是各种图形变换的坐标原点,同时会更改layer的position位置,它的缺省值是{0.5,0.5},也就是在layer 的中央。 某 layer.anchorPoint=CGPointMake(0.f,0.f); 若这么设置,layer的左上角就会被挪到原来的中间的位置。 但是加上这句代码就好了: 某 layer.position=CGPointMake(0.f,0.f);

  • 7、需要注意的: layer可以设置圆角显示,例如UIButton的效果,也就是设置阴影显示,但是如果layer树中的某个layer设置了圆角,树中所有layer的阴影效果都将显示不了。如果既想有圆角又要阴影,好像只能做两个重叠的UIView,一个显示圆角,一个显示阴影。

为什么?

  • 1.UIView 是什么,做什么

UIView是用来显示内容的,可以处理用户事件

  • 2.(CALayer是什么,做什么

CALayer是用来绘制内容的,对内容进行动画处理依赖与UIView来进行显示,不能处理用户事件。

  • 3.为何有两套结构?

并不是两套体系,UIView和CALayer是相互依赖的关系。UIView依赖与calayer提供的内容,CALayer依赖uivew提供的容器来显示绘制的内容。归根到底CALayer是这一切的基础,如果没有CALayer,UIView自身也不会存在,UIView是一个特殊的CALayer实现,添加了响应事件的能力。

  • 4.两者之间的关系

UIView来自CALayer,高于CALayer,是CALayer高层实现与封装。UIView的所有特性来源于CALayer支持。

------本文结束😘感谢阅读------