我可以在带有子视图的NSView上设置layer.transform吗?

时间:2011-05-13 16:01:13

标签: objective-c cocoa calayer nsview caanimation

我想要一个带有子视图(图像,文本等)的NSView,然后使用myView.layer.transform = myTransform对其应用三维变换。

阅读完文档后,我很困惑这是否允许。如果它是一个支持图层的视图,那么我不应该直接与图层交互,所以设置转换似乎是错误的。

如果它是一个图层托管视图,那么我不应该有子视图。

如果我想设置layer.transform,这是否意味着我必须通过CALayer设置我的所有绘图,并停止使用子视图?

1 个答案:

答案 0 :(得分:0)

我只是在NSView上设置了一个CALayer动画,它有嵌套的子视图,NSScrollViews,它运行正常。我认为限制是重叠的叠加视图。 (后者的问题是没有指定的绘图顺序;不可预测哪个视图将显示在顶部。)

但是如果你想将变换应用于子视图,你必须分别为它们设置图层。或者,是的,您可以转储子视图并将所有内容放在单个视图的CALayers上。您可以使用边界和位置属性控制其大小和位置。 (注意位置是从中心开始,而不是从左下方开始,除非您更改锚点。)

如果您正在进行图层托管,请不要将转换应用于根图层(view.layer)。相反,创建一个新的CALayer,向其添加内容,向其添加变换,并将其作为子层应用于根层。避免直接使用根层。

图层托管设置的快速示例:

// Set up the root layer.
[[self.aViewController view] setLayer:[CALayer layer]];
[[self.aViewController view] setWantsLayer:YES];
// Set up a sublayer.
CALayer *sublayer = [CALayer layer];
[self.aViewController.view.layer addSublayer:sublayer];
// Repeat if you need additional sublayers. There's a name property if you need to distinguish between them.