【问题标题】:Can I set layer.transform on an NSView with subviews?我可以在带有子视图的 NSView 上设置 layer.transform 吗?
【发布时间】:2011-08-25 01:50:00
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: objective-c cocoa calayer nsview caanimation


    【解决方案1】:

    我刚刚在具有嵌套子视图 NSScrollViews 的 NSView 上设置了 CALayer 动画,它工作正常。我认为限制在于重叠、叠加的视图。 (后者的问题是没有指定绘制顺序;无法预测哪个视图会显示在最上面。)

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

    如果您在进行层托管,请不要将您的转换应用到根层 (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.
    

    【讨论】:

    • +1:很好的答案。使兄弟视图重叠被记录为具有unreliable behavior
    • 感谢您的回复。我试过这个,但看到奇怪的闪烁,并认为这可能是因为不允许子视图。事实证明,更改变换属性会自动添加导致闪烁的动画。此外,我确实有兄弟姐妹重叠,但转换将它们分开并且工作正常。
    猜你喜欢
    • 2013-01-26
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多