2009-06-07 39 views
5

这是我的设置:我有一个CALAyer,我想添加子图层。我通过设置upa UILabel,然后将UILables图层添加到我的主图层来创建这些子图层。当然这会让沉重的UILabel对象在后台徘徊。是否有可能从UIView中获取其所有内容的图层并摆脱UIView本身? 我已经尝试过这样的:可能从UIView复制CALayer?

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

但每当我释放了UIView,该层的内容也被删除。这甚至可能或UIView的图层始终需要UIView本身来显示它的内容?我认为这个图层是UIView绘制的一种画布。我想我可能是错误的这个假设:)

回答

1

这是不可能的:一个图层是UIView的属性。因此,当您释放UIView时,其图层不见了。您将图层视为一种画布的想法并不错。但是,该层是其UIView的一个组成部分。

4

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

其实有要求的CALayer的方法:

- (id)initWithLayer:(id)layer 

但它并不打算做一个层的副本。 (你可以阅读苹果文档的推理为什么)

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

  1. 继承它并实现 “copyWithZone:”(和符合 NSCopying)
  2. 写的方法/函数,将 返回的CALayer的

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

比方说,你要复制只是内容和框架:

CALayer copyLayer = [CALayer layer]; 

copyLayer.contents = theLayerToBeCopied.contents; 
copyLayer.frame = theLayerToBeCopied.frame; 

return copyLayer; 

你可以去通过和每个属性复制一层,或者只是复制你需要的人。可能是放入CALayer类别的好方法。

+1

或许是因为一层的目的是呈现其相关的UIView和它的子层。如果UIView因为您释放而消失,那么为什么您需要使用最初绑定到该UIView的图层?如果你真的需要一个图层,我认为你也需要它的UIView。Haentz肯定会尝试你提出的方法(我不确定它是否会起作用),但是我之前在Core Animation代码中没有看到过。另外,如果苹果认为可以实现这一点,它将使CALayer符合NSCopying。请让我知道这种方法是否有效。 – 2009-06-07 15:51:18

0

UILabel确实不是一个非常复杂的控件。我建议你放弃这一行,并学习如何使用Quartz将你想要的东西绘制成新的CGImage。然后,您可以将其分配给CALayer的内容属性,而无需担心所有其他内容。

0

您也可以完全规避UILabel并使用CATextLayer创建您的文本。

0

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