UIView和calayer和view的区别的区别和联系

万物归根,UIView和CALayer都是的老祖都是NSObjet。
1:&UIView的继承结构为:&&:&。
可以看出UIView的直接父类为&类,&UIResponder&是gsm的呢?
官方的解释:
The&UIResponder&class defines an interface for objects that respond to and handle events. It is the superclass of&UIApplication,&UIView&and
its subclasses (which include&UIWindow). Instances of these classes are sometimes referred to as responder objects or, simply, responders.
The&UIView&class defines a rectangular area on the screen and the interfaces for managing the content in that area. At runtime, a view object handles the rendering of any content
in its area and also handles any interactions with that content. The&UIView&class itself provides basic behavior for filling its rectangular area with a background color. More sophisticated content can be presented
by subclassing&UIView&and implementing the necessary drawing and event-handling code yourself. The UIKit framework also includes a set of standard subclasses that range from simple buttons to complex tables and can
be used as-is. For example, a&object draws a text string and a&&object
draws an image.
可见&UIResponder是用来响应事件的,也就是UIView可以响应用户事件。
2:CALayer的继承结构为:&。
直接从&继承,因为缺少了UIResponder类,所以CALayer悲催的不能响应任何用户事件。
The&CALayer&class is the model class for layer-tree objects. It encapsulates the position, size, and transform of a layer, which defines its coordinate system. It also encapsulates
the duration and pacing of a layer and its animations by adopting the&&protocol, which defines a layer’s time space.
从官方的解释可以看出,CALayer定义了position、size、transform、animations&等基本属性。那UIView的size、frame、position这些属性是从那里来的呢?上面的官方解释没有说明这一点,我们一会再分析
至此我们了解到了,UIView&和CALayer的基本信息和主要负责处理的事情。
(2)所属框架
1:UIView是在&/System/Library/Frameworks/中定义的。
这个又是做什么的呢?
The UIKit framework provides the classes needed to construct and manage an application’s user interface for iOS. It provides an application object, event handling, drawing model, windows, views, and controls specifically designed for a touch screen interface.
可见UIKit主要是用来构建用户界面,并且是可以响应事件的(得意与UIView的父类UIResponder,至于UIResponderd的实现原理不是这次分析的目的,在此不做过多的解释)
在这里思考一个问题UIView既然是构建用户界面的,那他是通过什么方式绘制这些图片、文字之类的信息的呢?&
Ios中的2D图像绘制都是通过QuartzCore.framework实现的。难道是通过QuartzCore.framework实现的?那又是通过什么方式和QuartzCore.framework联系起来的呢??我们一会再看。
2:CALayer是在/System/Library/Frameworks/定义的。而且CALayer作为一个低级的,可以承载绘制内容的底层对象出现在该框架中。
现在比较一下uiview和calayer都可以显示图片文字等信息。难道apple提供了,两套绘图机制吗?不会。
UIView相比CALayer最大区别是UIView可以响应用户事件,而CALayer不可以。UIView侧重于对显示内容的管理,CALayer侧重于对内容的绘制。
大家都知道QuartzCore是IOS中提供图像绘制的基础库。并且CALayer是定义该框架中。难道UIView的底层实现是CALayer??
官方做出了明确的解释:
Displaying Layers in Views
Core Animation doesn't provide a means for actually displaying layers in a window, they must be hosted by a view. When paired with a view, the view must provide event-handling for the underlying layers, while the layers provide display of the content.
The view system in iOS is built directly on top of Core Animation layers. Every instance of&&automatically creates an instance of a&CALayer&class
and sets it as the value of the view’s&layer&property. You can add sublayers to the view’s layer as needed.
On Mac OS X you must configure an&NSView&instance in such a way that it can host a layer.
由此可见UIView是基于CALayer的高层封装。The view system in iOS is built directly on top of Core Animation layers.&
UIView&的方法:
layerClass&- Implement this method only if you want your view to use a different Core Animation layer for its backing store. For example, if you are using OpenGL ES to do your drawing, you would want to override this
method and return the&CAEAGLLayer&class.
该方法保留了UIView的本质。即对UIView所管理的内容,任何显示也是受到CALayer的影响的。
(3)相似支持
1:相似的树形结构
2:显示内容绘制方式
3: 布局约束
(4)&UIView&是什么,做什么
UIView是用来显示内容的,可以处理用户事件
(5)CALayer是什么,做什么
CALayer是用来绘制内容的,对内容进行动画处理依赖与UIView来进行显示,不能处理用户事件。
(6)为何有两套结构
并不是两套体系,UIView和CALayer是相互依赖的关系。UIView依赖与calayer提供的内容,CALayer依赖uivew提供的容器来显示绘制的内容。归根到底CALayer是这一切的基础,如果没有CALayer,UIView自身也不会存在,UIView是一个特殊的CALayer实现,添加了响应事件的能力。
(7)两者之间的关系
发之于肤,血之于肉,灵之于魄,男人之于肾的关系。依存的关系
UIView来自CALayer,高于CALayer,是CALayer高层实现与封装。UIView的所有特性来源于CALayer支持。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:23858次
排名:千里之外
原创:49篇
转载:51篇
(5)(1)(2)(8)(1)(2)(5)(1)(4)(1)(1)(11)(3)(3)(3)(3)(18)(12)(3)(4)(1)(5)(5)UIView与CALayer的区别_ios开发吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
UIView与CALayer的区别收藏
【1】UIView是iOS系统中界面元素的基础,所有的界面元素都继承自它。它本身完全是由CoreAnimation来实现的(Mac下似乎不是这样)。它真正的绘图部分,是由一个叫CALayer(Core Animation Layer)的类来管理。UIView本身,更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等等,实际上内部都是在访问它所包含的CALayer的相关属性。【2】UIView有个layer属性,可以返回它的主CALayer实例,UIView有一个layerClass方法,返回主layer所使用的类,UIView的子类,可以通过重载这个方法,来让UIView使用不同的CALayer来显示,例如通过1- (class) layerClass {2
return ([CAEAGLLayer class]);3}使某个UIView的子类使用GL来进行绘制。【3】UIView的CALayer类似UIView的子View树形结构,也可以向它的layer上添加子layer,来完成某些特殊的表示。例如下面的代码1grayCover = [[CALayer alloc] init];2grayCover.backgroundColor = [[[UIColor blackColor] colorWithAlphaComponent:0.2] CGColor];3[self.layer addSubLayer: grayCover];会在目标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】真实例子的分析
这是iphone上iBook翻页的效果,假设每一页都是一个UIView,我觉得一个页面是贴了俩个Layer,文字Layer显示正面的内容,背面layer用文字layer的快照做affine翻转,贴在文字layer的后面。因为Layer可以设置显示阴影,也许后面的阴影效果没有使用单独的一个layer来显示。至于这个曲面效果,我查了很多资料也没有结果,估计是使用了GL的曲面绘图?【8】最后一个让人恶心的。layer可以设置圆角显示,例如UIButton的效果,也可以设置阴影显示,但是如果layer树中的某个layer设置了圆角,树中所有layer的阴影效果都将显示不了了。如果既想有圆角又想要阴影,好像只能做两个重叠的UIView,一个的layer显示圆角,一个的layer显示阴影.....
CALayer属于Core Animation部分的内容,比较重要而不太好理解。以下是园子中看到的一篇文章的摘录:【1】UIView是iOS系统中界面元素的基础,所有的界面元素都是继承自它。它本身完全是由CoreAnimation来实现的。它真正的绘图部分,是由一个CALayer类来管理。UIView本身更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等,实际上内部都是在访问它所包含的CALayer的相关属性。【2】 UIView有个重要属性layer,可以返回它的主CALayer实例。// 要访问层,读取UIView实例的layer属性CALayer *layer = myView.layer所有从UIView继承来的对象都继承了这个属性。这意味着你可以转换、缩放、旋转,甚至可以在Navigation bars,Tables,Text boxes等其它的View类上增加动画。每个UIView都有一个层,控制着各自的内容最终被显示在屏幕上的方式。UIView的layerClass方法,可以返回主layer所使用的类,UIView的子类可以通过重载这个方法,来让UIView使用不同的CALayer来显示。代码示例:- (class)layerClass {return ([CAEAGLLayer class]);}上述代码使得某个UIView的子类使用GL来进行绘制。【3】 UIView的CALayer类似UIView的子View树形结构,也可以向它的layer上添加子layer,来完成某些特殊的表示。即CALayer层是可以嵌套的。示例代码:grayCover = [[CALayer alloc] init];grayCover.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.2] CGColor];[self.layer addSubLayer:grayCover];上述代码会在目标View上敷上一层黑色透明薄膜的效果。【4】UIView的layer树形在系统内部,被维护着三份copy。分别是逻辑树,这里是代码可以操纵的;动画树,是一个中间层,系统就在这一层上更改属性,进行各种渲染操作;显示树,其内容就是当前正被显示在屏幕上得内容。【5】动画的运作:对UIView的subLayer(非主Layer)属性进行更改,系统将自动进行动画生成,动画持续时间的缺省值似乎是0.5秒。【6】 坐标系统: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);最后:layer可以设置圆角显示(cornerRadius),也可以设置阴影 (shadowColor)。但是如果layer树中某个layer设置了圆角,树种所有layer的阴影效果都将不显示了。因此若是要有圆角又要阴影,变通方法只能做两个重叠的UIView,一个的layer显示圆角,一个layer显示阴影......【7】渲染:当更新层,改变不能立即显示在屏幕上。当所有的层都准备好时,可以调用setNeedsDisplay方法来重绘显示。[gameLayer setNeedsDisplay];若要重绘部分屏幕区域,请使用setNeedsDisplayInRect:方法,通过在CGRect结构的区域更新:[gameLayer setNeedsDisplayInRect:CGRectMake(150.0,100.0,50.0,75.0)];如果是用的Core Graphics框架来执行渲染的话,可以直接渲染Core Graphics的内容。用renderInContext:来做这个事。[gameLayer renderInContext:UIGraphicsGetCurrentContext()];【8】变换:要在一个层中添加一个3D或仿射变换,可以分别设置层的transform或affineTransform属性。characterView.layer.transform = CATransform3DMakeScale(-1.0,-1.0,1.0);CGAffineTransform transform = CGAffineTransformMakeRotation(45.0);backgroundView.layer.affineTransform =【9】变形:Quartz Core的渲染能力,使二维图像可以被自由操纵,就好像是三维的。图像可以在一个三维坐标系中以任意角度被旋转,缩放和倾斜。CATransform3D的一套方法提供了一些魔术般的变换效果。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或CALayer与UIView的关系
CALayer与UIView的关系
CALayer属于Core Animation部分的内容,比较重要而不太好理解。1. UIView是iOS系统中界面元素的基础,所有的界面元素都是继承自它。它本身完全是由CoreAnimation来实现的。它真正的绘图部分,是由一个CALayer类来管理。UIView本身更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等,实际上内部都是在访问它所包含的CALayer的相关属性。2. UIView有个重要属性layer,可以返回它的主CALayer实例。// 要访问层,读取UIView实例的layer属性CALayer *layer = myView.layer所有从UIView继承来的对象都继承了这个属性。这意味着你可以转换、缩放、旋转,甚至可以在Navigation bars,Tables,Text boxes等其它的View类上增加动画。每个UIView都有一个层,控制着各自的内容最终被显示在屏幕上的方式。UIView的layerClass方法,可以返回主layer所使用的类,UIView的子类可以通过重载这个方法,来让UIView使用不同的CALayer来显示。代码示例:- (class)layerClass {
return ([CAEAGLLayer class]);}上述代码使得某个UIView的子类使用GL来进行绘制。3. UIView的CALayer类似UIView的子View树形结构,也可以向它的layer上添加子layer,来完成某些特殊的表示。即CALayer层是可以嵌套的。示例代码:grayCover = [[CALayer alloc] init];grayCover.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.2] CGColor];[self.layer addSubLayer:grayCover];上述代码会在目标View上敷上一层黑色透明薄膜的效果。4. UIView的layer树形在系统内部,被维护着三份copy。分别是逻辑树,这里是代码可以操纵的;动画树,是一个中间层,系统就在这一层上更改属性,进行各种渲染操作;显示树,其内容就是当前正被显示在屏幕上得内容。5. 动画的运作:对UIView的subLayer(非主Layer)属性进行更改,系统将自动进行动画生成,动画持续时间的缺省值似乎是0.5秒。6. 坐标系统: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);最后:layer可以设置圆角显示(cornerRadius),也可以设置阴影&(shadowColor)。但是如果layer树中某个layer设置了圆角,树种所有layer的阴影效果都将不显示了。因此若是要有圆角又要阴影,变通方法只能做两个重叠的UIView,一个的layer显示圆角,一个layer显示阴影......7.渲染:当更新层,改变不能立即显示在屏幕上。当所有的层都准备好时,可以调用setNeedsDisplay方法来重绘显示。[gameLayer setNeedsDisplay];若要重绘部分屏幕区域,请使用setNeedsDisplayInRect:方法,通过在CGRect结构的区域更新:[gameLayer setNeedsDisplayInRect:CGRectMake(150.0,100.0,50.0,75.0)];如果是用的Core Graphics框架来执行渲染的话,可以直接渲染Core Graphics的内容。用renderInContext:来做这个事。[gameLayer renderInContext:UIGraphicsGetCurrentContext()];8.变换:要在一个层中添加一个3D或仿射变换,可以分别设置层的transform或affineTransform属性。characterView.layer.transform = CATransform3DMakeScale(-1.0,-1.0,1.0);CGAffineTransform transform = CGAffineTransformMakeRotation(45.0);backgroundView.layer.affineTransform =9.变形:Quartz Core的渲染能力,使二维图像可以被自由操纵,就好像是三维的。图像可以在一个三维坐标系中以任意角度被旋转,缩放和倾斜。CATransform3D的一套方法提供了一些魔术般的变换效果。
发表评论:
TA的最新馆藏[转]&CALayer与UIView的关系 - darren.yang - 博客园
CALayer属于Core Animation部分的内容,比较重要而不太好理解。以下是园子中看到的一篇文章的摘录:
1. UIView是iOS系统中界面元素的基础,所有的界面元素都是继承自它。它本身完全是由CoreAnimation来实现的。它真正的绘图部分,是由一个CALayer类来管理。UIView本身更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等,实际上内部都是在访问它所包含的CALayer的相关属性。
2. UIView有个重要属性layer,可以返回它的主CALayer实例。
// 要访问层,读取UIView实例的layer属性CALayer *layer = myView.layer
所有从UIView继承来的对象都继承了这个属性。这意味着你可以转换、缩放、旋转,甚至可以在Navigation bars,Tables,Text boxes等其它的View类上增加动画。每个UIView都有一个层,控制着各自的内容最终被显示在屏幕上的方式。UIView的layerClass方法,可以返回主layer所使用的类,UIView的子类可以通过重载这个方法,来让UIView使用不同的CALayer来显示。代码示例:
- (class)layerClass {
return ([CAEAGLLayer class]);}
上述代码使得某个UIView的子类使用GL来进行绘制。
3. UIView的CALayer类似UIView的子View树形结构,也可以向它的layer上添加子layer,来完成某些特殊的表示。即CALayer层是可以嵌套的。示例代码:
grayCover = [[CALayer alloc] init];grayCover.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.2] CGColor];[self.layer addSubLayer:grayCover];
上述代码会在目标View上敷上一层黑色透明薄膜的效果。
4. UIView的layer树形在系统内部,被维护着三份copy。分别是逻辑树,这里是代码可以操纵的;动画树,是一个中间层,系统就在这一层上更改属性,进行各种渲染操作;显示树,其内容就是当前正被显示在屏幕上得内容。
5. 动画的运作:对UIView的subLayer(非主Layer)属性进行更改,系统将自动进行动画生成,动画持续时间的缺省值似乎是0.5秒。
6. 坐标系统: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);
最后:layer可以设置圆角显示(cornerRadius),也可以设置阴影&(shadowColor)。但是如果layer树中某个layer设置了圆角,树种所有layer的阴影效果都将不显示了。因此若是要有圆角又要阴影,变通方法只能做两个重叠的UIView,一个的layer显示圆角,一个layer显示阴影......
7.渲染:当更新层,改变不能立即显示在屏幕上。当所有的层都准备好时,可以调用setNeedsDisplay方法来重绘显示。
[gameLayer setNeedsDisplay];
若要重绘部分屏幕区域,请使用setNeedsDisplayInRect:方法,通过在CGRect结构的区域更新:
[gameLayer setNeedsDisplayInRect:CGRectMake(150.0,100.0,50.0,75.0)];
如果是用的Core Graphics框架来执行渲染的话,可以直接渲染Core Graphics的内容。用renderInContext:来做这个事。
[gameLayer renderInContext:UIGraphicsGetCurrentContext()];
8.变换:要在一个层中添加一个3D或仿射变换,可以分别设置层的transform或affineTransform属性。
characterView.layer.transform = CATransform3DMakeScale(-1.0,-1.0,1.0);CGAffineTransform transform = CGAffineTransformMakeRotation(45.0);backgroundView.layer.affineTransform =
9.变形:Quartz Core的渲染能力,使二维图像可以被自由操纵,就好像是三维的。图像可以在一个三维坐标系中以任意角度被旋转,缩放和倾斜。CATransform3D的一套方法提供了一些魔术般的变换效果。
&本文转载自编程之美| 漏洞检测 |
| 隐藏捆绑 |
iOS --- UIView与CALayer的联系与区别
UIView是iOS系统中界面元素的基础, 所有的界面元素都继承自它, UIView本身完全是由CoreAnimation来实现. 真正的绘图部分, 是由一个CALayer类来管理. UIView更像是一个CALayer的管理器, 所以访问它的与绘图和坐标相关的属性, 如frame, bounds等, 实际上都是在
是iOS系统中界面元素的基础, 所有的界面元素都继承自它, 本身完全是由CoreAnimation来实现. 真正的绘图部分, 是由一个类来管理. UIView更像是一个的管理器, 所以访问它的与绘图和坐标相关的属性, 如frame, bounds等, 实际上都是在访问其所包含的CALayer的相关属性. 因此, 可以在所有UIView的子类上实现动画效果.
UIView继承自UIResponder, 能接收并响应事件, 负责显示内容的管理, 而CALayer继承自NSObject, 不能响应事件, 负责显示内容的绘制.
UIView的layer属性
获取UIView的layer属性:
CALayer *layer = self.view.
UIView的layerClass方法返回layer使用的类. 可以重写该方法, 使UIView的继承类使用指定的CALayer来显示, 如下代码可使其使用OpenGL来进行绘制.
+ (Class)layerClass {
return [CAEAGLLayer class];
对于UIViewController, 可做如下操作让其UIView使用OpenGL来绘制. CALayer的层级结构与UIView的类似, addSublayer与addSubview的作用类似.
CAEAGLLayer *eaglLayer = [CAEAGLLayer layer];
eaglLayer.frame = self.view.
eaglLayer.opaque = YES;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],kEAGLDrawablePropertyRetainedBacking,kEAGLColorFormatRGBA8,kEAGLDrawablePropertyColorFormat, nil];
[self.view.layer addSublayer:eaglLayer];
当CALayer有了更新, 而不能立即显示, 可使用setNeedsDisplay方法来重绘显示.
[myLayer setNeedsDisplay];
// 更新局部区域
[myLayer setNeedsDisplayInRect:CGRectMake(100,100,50,50)];
// CoreGraphics可以直接使用renderInContext
[myLayer renderInContext:UIGraphicsGetCurrent()];
一个UIView可以有多个CALayer, UIView的尺寸样式都是由内部的CALayer来提供的. 每一个CALayer显示一种效果, 因此, 通过添加多种效果的CALayer, 以增强UIView的显示能力. 如UIView自身不能设置圆角等效果, 而CALayer可设置边框, 圆角, 阴影和变换变形等. 两者都有树状层级结构, CALayer有subLayers, UIView有subViews.
contents属性
CALayer *aLayer = [[CALayer alloc]
aLayer.contents = [[UIImage imageNamed:@testImage] CGImage];
aLayer.contentsGravity = kCAGravityResizeAspectF
这里使用图片给contents赋值的话, 一定要是CGImage.
可以通过设置contentsGravity设置其显示模式, 相当于UIView的contentMode, 如kCAGravityResizeAspectFill 是铺满的 。kCAGravityResizeAspect 是显示自己本身的大小 。
若果图片超出CALayer 可以使用maskToBounds 进行裁剪 ,剪掉超出的部分 (配合圆角使用不错)。
contentsRect
用来裁剪图片, 默认的contentsRect是{0, 0, 1, 1}, 即整个图都默认可见. 如果我们改成{0,0,0.5,0.5} 图像就就会被裁剪掉左上角的1/4.
CALayer效果
aLayer.backgroundColor = [[[UIColor redColor] colorWithAlphaComponent:0.2] CGColor];
aLayer.boardColor = [[UIColor blueColor] CGColor];
aLayer.boardWidth = 2.0;
aLayer.cornerRadius = 10.0;
aLayer.shadowColor = [[UIColor greenColor] CGColor];
aLayer.shadowOpacity = 0.5;
aLayer.shadowOffset = CGSizeMake(2, 1);
[self.view.layer addSublayer:aLayer];
圆角(cornerRadius)和阴影(shadowColor), 二者不能同时出现, 所以可以通过两个重叠的UIView, 分别使其CALayer显示圆角和阴影.
QuartzCore的CATransform3D提供了旋转,缩放和倾斜等变换效果.
添加3D或者仿射变换如下:
myView.layer.transform = CATransform3DMakeScale(-1.0, -1.0, 1.0);
CGAffineTransform transform = CGAffineTransformMakeRotation(45.0);
myView.layer.affineTransform =
取消动画可以使用[layer removeAllAnimations];
可参考swift详解之二十四&&&&&CoreAnimation(一)CALayer.
Layer Tree
CALayer内部维护着三份layer tree, 分别是presentLayer Tree(动画树), mode Layer Tree(模型树), Render Tree(渲染树), 在做iOS动画的时候, 我们修改动画的属性, 在动画的其实是Layer的presentLayer的属性值, 而最终展示在界面上其实是提供UIView的modeLayer.
UIView与CALayer的
UIView继承自UIResponder,主要特点是可以响应触摸事件。而CALayer是实际的图层内容管理, 不会直接渲染到屏幕上。大家干的的事情不一样,是两个东西,大家的存在互不影响,理所当然。
简单将CALayer视作只能显示, 不能响应事件的特殊UIV 或将UIView视作能接收和响应事件的CALayer.
UIKit使用UIResponder作为响应对象, 来响应系统传递过来的事件并进行处理.
UIApplication, UIViewController, UIView和所有从UIView派生出来的UIKit类(包括UIWindow)都直接或间接地继承自UIResponder类. UIResponder中定义了处理各种事件和事件传递的接口.处理事件如touchesBegan:withEvent:, touchesMoved:withEvent:, touchesEnded:withEvent:等.
而CALayer直接继承自NSObject, 并没有相应的处理事件的接口.
关于UIResponder的更多内容请参考以下两篇文章:
1. Responder Chain简析
2. 视图和窗口架构
frame, position, bounds调用
一个CALayer的frame是由其anchorPoint, position, bounds, transform共同决定的, 而一个UIView的的frame只是简单地返回CALayer的frame, 同样UIView的center和bounds也只是简单返回CALayer的Position和Bounds对应属性.
机制与策略分离
UIView主要是对显示内容的管理, 而CALayer主要是显示内容的绘制. UIView是CALayer的CALayerDelegate, 在代理方法内部[UIView(CALayerDelegate) drawLayer:inContext]调用UIView的drawRect方法, 从而绘制出UIView的内容. UIView的显示内容由内部的CALayer:display方法来实现.
编程问题都可以抽离出机制和策略部分。机制一旦实现,就会很少更改,但策略会经常得到优化。CALayer也可以看做是一种机制,提供图层绘制,CALayer的头文件基本上是没怎么变过的,而UIView可以看做是策略,变动很多。越是底层越是机制,越是机制就越是稳定。机制与策略分离,可以使得需要修改的代码更少,特别是底层代码,这样可以提高系统的稳定性。UIView遮蔽了大部分的CALayer接口,抽取构造出更易用的frame和动画实现,这样上手更容易。
CALayer默认产生隐式动画
(责任编辑:幽灵学院)
------分隔线----------------------------
一:iOS项目开发中,需要动态返回行高自定义cell的场景可以...
在程序中如果需要监听电话状态,可以引入CoreTelephony框架...
《从零开始学Swift》学习笔记(Day 69)――Swift与Objectiv...
《从零开始学Swift》学习笔记(Day 53)――do-try-catch错...
GCD 通信操作 pragma mark - GCD 通信- (void)sendMessage{ ...
本章项目demo:https: github com zhonggaorong alipayDemo支...
工作日:9:00-21:00
周 六:9:00-18:00
&&扫一扫关注幽灵学院

我要回帖

更多关于 calayer和uiview 的文章

 

随机推荐