2011-05-13 95 views
1

我想要一个带子视图(图像,文本等)的NSView,然后使用myView.layer.transform = myTransform对其应用3D变换。我可以在带有子视图的NSView上设置layer.transform吗?

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

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

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

回答

1

我只是在一个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. 
+0

+1:很好的回答。使兄弟姐妹视图重叠被记录为具有[不可靠行为](http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaViewsGuide/WorkingWithAViewHierarchy/WorkingWithAViewHierarchy.html#//apple_ref/doc/uid/TP40002978 -CH4-SW16)。 – 2011-05-14 02:42:10

+0

感谢您的回复。我曾尝试过,但看到奇怪的闪烁,并认为这可能是因为子视图是不允许的。原来,改变transform属性会自动添加一个导致闪烁的动画。此外,我确实有兄弟姐妹重叠,但转换分离出来,它工作正常。 – initlaunch 2011-05-14 21:37:48

相关问题