繁体   English   中英

可以从 UIView 复制 CALayer 吗?

[英]Possible to copy CALayer from UIView?

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

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

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

我不明白为什么你不能复制图层。 真正的图层是 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 的一个组成部分。

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

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

重点是,除非你特别需要 UILayers,只要坚持完全使用 UIViews 就可以了。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM