今天,被坑了,面试的时候没回答出来,特此记录一下

一.继承结构

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,来完成某些特殊的表示。
例如下面的代码:     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支持。

UIView 和 CALayer区别 为啥有UIView还要CALayer?的更多相关文章

  1. UIView与CALayer 区别

    在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个 ...

  2. UIView和CALayer区别

    (1)首先UIView可以响应用户的触摸事件,Layer不可以. (2)View中frame getter方法,bounds和center,UIView并没有做什么工作:它只是简单的各自调用它底层的C ...

  3. 核心动画和UIView动画的区别

    核心动画和UIView动画的区别 1.核心动画制作用在Layer 2.核心动画的修改的属性都是假象,他的真实位置没有发生变化()

  4. ios开发核心动画七:核心动画与UIView动画的区别

    /** UIView与核心动画区别?(掌握) 1.核心动画只作用在layer. 2.核心动画看到的都是假像,它并没有去修改UIView的真实位置. 什么时候使用核心动画? 1.当不需要与用户进行交互, ...

  5. CGLayer和CALayer区别

    CGLayer是一种很好的缓存常绘内容的方法.注意,不要与CALayer混淆.CALayer是Core Animation中更加强大.复杂的图层对象,而CGLayer是Core Graphics中优化 ...

  6. UIView CALayer 的区别

    UIView与CALayer的区别,很详细 研究Core Animation已经有段时间了,关于Core Animation,网上没什么好的介绍.苹果网站上有篇专门的总结性介绍,但是似乎原理性的东西不 ...

  7. UIView与CALayer的区别,很详细(基础教学拓展)转

    研究Core Animation已经有段时间了,关于Core Animation,网上没什么好的介绍.苹果网站上有篇专门的总结性介绍,但是似乎原理性的东西不多,看得人云山雾罩,感觉,写那篇东西的人,其 ...

  8. UIView和CALayer的区别

    CALayer属于Core Animation部分的内容,比较重要而不太好理解.以下是园子中看到的一篇文章的摘录: 以下摘自<<核心动画编程指南>>: 两者最大的区别是,图层不 ...

  9. UIView与CALayer的区别

    1.UIView相比CALayer最大区别是UIView可以响应用户事件,而CALayer不可以.UIView侧重于对显示内容的管理,CALayer侧重于对内容的绘制. 2.UIView和CALaye ...

随机推荐

  1. C#网络编程(订立协议和发送文件) - Part.4

    文件传输 前面两篇文章所使用的范例都是传输字符串,有的时候我们可能会想在服务端和客户端之间传递文件.比如,考虑这样一种情况,假如客户端显示了一个菜单,当我们输入S1.S2或S3(S为Send缩写)时, ...

  2. Java开发前期准备工作

    配置Java开发环境变量 在"系统变量"中设置3项属性,JAVA_HOME, PATH, CLASSPATH. 变量设置参数如下: 变量名:JAVA_HOME 变量值:C:\Pro ...

  3. 野村综合社,惠普2面,索尼,CDK面试经理

    今天疯了一口气面试了四个企业,自我介绍都说了七八遍,晚上回家到头就睡.中间接了oracle的电话,也不知道如何. 11:00野村面试 野村综合社北京流通部 面试3个人,一个英语部门负责人,一个日语负责 ...

  4. java向数据库插入时间

    tbUrsMember.setMemberRegisterTime(new Date(System.currentTimeMillis()));

  5. 让maven生成可运行jar包

    平时项目大多用到的是war包,今天实现了一个简单功能,无需部署到web服务器上,只需本地跑java代码即可,因此只要生成一个jar包.那么怎么让maven项目打成一个可以使用java命令跑的jar包呢 ...

  6. ubuntu下网卡eth1如何修改为eth0

    正常来说,Linux在识别网卡时第一张会是eth0,第二张才是eth1.有时候我们使用虚拟机克隆技术后网卡的信息就会改变,新克隆出来的虚拟主机网卡名字可能变为eth1.无论我们怎么修改都无法改变,这就 ...

  7. python3之scrapy安装使用

    需要安装的包 pip install scrapy selenium 可能需要卸载重装的模块   lxml cryptography  cffi  pypiwin32 pip uninstall xx ...

  8. 1132 Cut Integer

    题意:略. 思路:注意除数可能为0的情况,不然会导致浮点错误. 代码: #include <iostream> #include <string> using namespac ...

  9. 1052 Linked List Sorting

    题意:链表排序 思路:题目本身并不难,但是这题仔细读题很重要.原题中有一句话,"For each case, the first line contains a positive N and ...

  10. 八 Connect API 连接器

    Connect API: 实现一个连接器(connector),不断地从一些数据源系统拉取数据到kafka,或从kafka推送到宿系统(sink system). 大多数Connect使用者不需要直接 ...