IOS学习---CALayer 和UIView

7 篇文章 1 订阅
2 篇文章 0 订阅

这两天做了一个CALayer的动画Demo,

然后一直在想CALayer 和UIView之间的关系,CALayer 和UIView之间动画的差别等问题。

网上查阅资料,跟大伙一起学习一下。


From: fairzy

在Core Animation的layer和Cocoa的view之间最大的概念上的区别就是,layer是不直接在屏幕上绘制。UIView在MVC模式中处于View层,Core Animation实际上是Model层的,它封装了几何属性,计时以及内容被显示时的可见的一些属性,但显示实际上不是layer的职责所在。

CAlayer层树是cocoa视图继承树的同等物,它具备UIView的很多共同点,但是Core Animation没有提供一个 方法展示在窗口。他们必须宿主到UIView中,并且UIView给他们提供响应的方法。所以UIReponder就是UIView的又一个大的特性。

动画和层

在核心动画中,时间无处不在。当你需要一个层有动画属性时,你需要考虑动画的时长,如何动,是否要返回到初始的值,以及在动画其间属性应该有多少个不同的值(基础动画与关键帧动画)。通过设定动画属性的值,可以让你指定动画的不同属性。然而,这些值都不能被层本身指派,而是在CAAnimation这个对象或者它的子类中,CABasicAnimation、CAKeyframeAnimation里指派的。

再次重申,在MVC设计模式中,层是一个模型(Model)对象,而不是一个视图(View)对象。层包含了如下的属性:位置,轮廓,颜色等等。简单的说,尽管一个动画只要描述动画本身,但是你设定的动画属性也关系到你正在做动画的层。你可以通过调用addAnimation:forKeyPath这个方法,来增加动画对象到层中,这样就能触发动画了。同样的,你可以通过调用removeAnimation:forKeyPath来停止一层中的动画,不过在默认情况下,动画运行完毕就回自动的执行以上行为。

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

2.UIView有个layer属性,可以返回它的主CALayer实例,UIView有一个layerClass方法,返回主layer所使用的类,UIView的子类,可以通过重载这个方法,来让UIView使用不同的CALayer来显示,例如通过
- (class) layerClass {
  return ([CAEAGLLayer class]);
}
3.UIView的CALayer类似UIView的子View树形结构,也可以向它的layer上添加子layer,来完成某些特殊的表示。例如下面的代码
grayCover = [[CALayer alloc] init];
grayCover.backgroundColor = [[[UIColor blackColor] colorWithAlphaComponent:0.2] CGColor];
[self.layer addSubLayer: grayCover];
会在目标View上敷上一层黑色的透明薄膜。

4.UIView的layer树形在系统内部,被系统维护着三份copy。
第一份,逻辑树,就是代码里可以操纵的,例如更改layer的属性等等就在这一份。
第二份,动画树,这是一个中间层,系统正在这一层上更改属性,进行各种渲染操作。
第三份,显示树,这棵树的内容是当前正被显示在屏幕上的内容。
这三棵树的逻辑结构都是一样的,区别只有各自的属性。

5.动画的运作
UIView的主layer以外(我觉得是这样),对它的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显示阴影......


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值