是否可以从UIView复制CALayer?

问题描述 投票:5回答:6

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

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

但是只要我释放UIView,该图层的内容也会被删除。这是否有可能,或者UIView的图层是否始终需要UIView本身来显示其内容?我认为该层是UIView绘制到的一种画布。我想我可能会错了这个假设:)

iphone core-animation
6个回答
4
投票

我不明白为什么您无法复制图层。诚然,图层是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类别可能是一个好方法。


1
投票

不可能:图层是UIView的属性。因此,当您释放UIView时,其层消失了。您将图层视为一种画布的想法是正确的。但是,该层是其UIView不可或缺的一部分。


0
投票

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


0
投票

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


0
投票

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


0
投票

UIViews在iOS中不那么繁重。尽管不是100%准确,但在大多数情况下,您可以将它们视为CALayer的辅助包装。与Mac上不需要CALayer支持的NSView不同,在iOS中并非如此。 全部 UIViews是由CALayer支持的,这就是大多数繁重工作的地方。苹果公司的文档甚至说“不要为UIView的图层设置动画”。直接对UIView进行动画处理,因为它实际上只是将其全部发送到图层。” (当然,改写为)。

要点是,除非您特定地

需要UILayers,否则只需完全使用UIViews,您应该会很好。”>
© www.soinside.com 2019 - 2024. All rights reserved.