如何在CALayer中定位`contents` png?

时间:2010-10-29 08:07:13

标签: iphone core-animation

我是否必须移动图层框架或将转换矩阵转换应用于图层?或者我可以移动图层内的contents?如果内容不能在图层内部移动,它最初会如何定位?

1 个答案:

答案 0 :(得分:1)

CALayer有一个框架(或者,相当于一个边界和一个原点),它在逻辑上用于确定要绘制的内容。当调用drawInContext:或者等价物时,它就是决定内容产生方式的框架。

然而,与OS X一样,iOS采用合成窗口管理器,这意味着视图知道如何将其输出绘制到缓冲区,并且缓冲区被组合以创建视图,窗口管理器确定如何处理缓存和之间的视频内存管理。

如果调整视图或图层类的transform属性,则调整合成的发生方式。但是,drawInContext:的结果应该明确地保持相同,因此窗口管理器知道它只能使用缓存的图像。

因此,例如,如果您设置一个大小为128x128的帧,然后将一个将CALayer缩放到两倍的变换,您将占据屏幕的256x256区域,但用于合成的图像大小仅为128x128 ,将每个源像素分成四个目标像素。如果你设置一个256x256大小的帧和身份变换,你将覆盖相同数量的屏幕空间,但每个源像素与目标像素相关的是1:1。

副作用是更改框架会导致重绘第一原则。改变变换不会。因此后者通常更快,如果您决定使用像CATiledLayer(在Safari,地图等中使用的)那样的东西,它会在单独的线程中绘制并且可能需要一段时间才能得出结果。 / p>

根据经验,您可以使用框架设置初始位置并更新正常工作的框架。您可以使用转换和其他特殊效果进行转换。但是,CATiledLayer的所有帧和变换属性在CoreAnimation意义上都是可动画的,所以这仍然由您自行决定。

大多数人不在CALayer级别上工作,但更喜欢使用UIViews。在这种情况下,注释大致相同,但需要注意的是,您可以调整视图上的[2d]变换或视图图层上的[3d]变换,让合成器将其全部计算出来,但将帧更改为提示重绘。