【问题标题】:Possible to copy CALayer from UIView?可以从 UIView 复制 CALayer 吗?
【发布时间】:2009-06-07 14:31:17
【问题描述】:

这是我的设置:我有一个想要添加子层的 CALAyer。我通过设置 UILabel 然后将 UILables 层添加到我的主层来创建这些子层。当然,这会使沉重的 UILabel 对象在背景中徘徊。是否可以从 UIView 获取包含所有内容的图层并摆脱 UIView 本身? 我已经试过了:

UILabel* label;
[...]
[mainLayer addSublayer:[label.layer copy]];
[label release];

但是每当我释放 UIView 时,图层的内容也会被删除。这甚至可能还是 UIView 的层总是需要 UIView 本身来显示它的内容?我认为该层是一种画布,UIView 会在上面绘制。我想我可能对这个假设有误:)

【问题讨论】:

    标签: iphone core-animation


    【解决方案1】:

    我不明白您为什么不能复制图层。真正的层是 UIView 的“组成部分”。但最终它只是另一个具有多个属性的对象。

    其实CALayer有个方法叫:

    - (id)initWithLayer:(id)layer
    

    但它并不打算制作图层的副本。 (您可以阅读 Apple 的文档了解原因)

    CALayer 不符合 NSCopying,所以你有两种选择:

    1. 子类化并实现 “copyWithZone:”(并符合 NSCopying)
    2. 编写一个方法/函数,它将 返回 CALayer 的“副本”

    无论你选择哪种方式,你要问的问题是:你想复制CALlayer的哪些属性?

    假设您只想复制内容和框架:

    CALayer copyLayer = [CALayer layer];
    
    copyLayer.contents = theLayerToBeCopied.contents;
    copyLayer.frame = theLayerToBeCopied.frame;
    
    return copyLayer;
    

    您可以检查并复制图层的每个属性,或者只复制您需要的属性。可能是放入 CALayer 类别的好方法。

    【讨论】:

    • 可能是因为图层的目的是渲染其关联的 UIView 及其子图层。如果 UIView 因为你释放它而消失了,那你为什么需要使用一个最初绑定到那个 UIView 的层呢?如果你真的需要一个层,我觉得你也需要它的 UIView 是合乎逻辑的。 Haentz 肯定会尝试您建议的方法(我不确定它是否会起作用),但我之前在 Core Animation 代码中没有看到过这种情况。此外,如果 Apple 想让这成为可能,它会让 CALayer 与 NSCopying 兼容。请让我知道这种方法是否有效。
    • 我能看到复制 CALayer 的唯一原因是他是否需要在屏幕上显示多个同一图层。我认为通常你会像创建第一个图层一样创建多个图层。虽然,如果你打算摧毁第一个,我也不明白你为什么要复制。我的想法是,他并不真正需要一个“副本”,而是他需要一个与原始图层具有相同属性的图层。你是对的,因为它可能不是问题的公认解决方案,但看看它是如何工作的很有趣。
    【解决方案2】:

    不可能:图层是 UIView 的属性。因此,当你释放 UIView 时,它的层就消失了。您将图层视为一种画布的想法并没有错。但是,图层是其 UIView 不可或缺的一部分。

    【讨论】:

      【解决方案3】:

      UILabel 确实不是一个非常复杂的控件。我建议你放弃这种攻击方式,学习如何使用 Quartz 将你想要的东西绘制到一个新鲜的 CGImage 中。然后,您可以将其分配给 CALayer 的 contents 属性,而不必担心所有其他内容。

      【讨论】:

        【解决方案4】:

        您还可以完全绕过 UILabel 并使用 CATextLayer 创建文本。

        【讨论】:

          【解决方案5】:

          使用 CAReplicatorLayer,您将能够完全复制该层

          【讨论】:

            【解决方案6】:

            UIViews 在 iOS 中并没有那么重。虽然不是 100% 准确,但在大多数情况下,您可以将它们视为 CALayer 的支持包装器。与在 Mac 上 NSView 不必由 CALayer 支持的情况不同,在 iOS 中并非如此。 所有 UIViews 都是 CALayer 支持的,这就是大部分繁重工作的地方。 Apple 的文档甚至说“不要费心为 UIView 的图层设置动画”之类的话。直接为 UIView 设置动画,因为它本质上只是将其全部发送到图层。 (当然是转述。)

            重点是,除非您特别需要 UILayers,否则只要坚持完全使用 UIViews,您应该一切顺利。

            【讨论】:

              猜你喜欢
              • 2011-05-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-10-15
              • 2012-04-20
              • 1970-01-01
              • 2012-09-18
              • 1970-01-01
              相关资源
              最近更新 更多