【问题标题】:How do you create a copy of an UIImageView instance?如何创建 UIImageView 实例的副本?
【发布时间】:2011-01-07 02:06:00
【问题描述】:

如何创建可以独立于第一个实例进行操作的 UIImageView 实例的副本?

我试过UIImageView *tempCopy = [instance copy],但它崩溃了。还有其他方法吗?

【问题讨论】:

  • 你确定不想要它所代表的 UIImage 吗?
  • UIImageView是一系列的UIButton,我可以把它们当作UIImageView的UIImage吗?

标签: iphone cocoa-touch uiimageview copy


【解决方案1】:

它可能会崩溃,因为 UIImageView 不符合 NSCopying 协议。自己动手吧:实例化一个新的 UIImageView 并设置您感兴趣的原始属性。

【讨论】:

  • 有没有复制所有的属性?我要复制的是一个极其精细的对象
  • 怎么样?只需分配几个值,就完成了。
  • 我要复制的是所有的子视图,有没有我不知道的简单方法?
  • 那是一个不同的问题...您可以为一个 UIView 实现一个复制例程,并使用 view.subViews 数组递归遍历视图树,同时检查每个节点的视图类型。可怕的解决方案。为什么不首先创建两次?
  • 对象交互很复杂,我正在努力简化它,谢谢,但我需要找到另一种方法。
【解决方案2】:

UIImageView 不符合 NSCopying,但它符合 NSCoding。存档您的视图,然后将其取消存档以获得全新的副本。

对于懒惰的人来说,这看起来像:

NSData *archive = [NSKeyedArchiver archivedDataWithRootObject:imageView];
UIImageView *copy = [NSKeyedUnarchiver unarchiveObjectWithData:data];

【讨论】:

  • 你看到的时间大约是加载笔尖的两倍(假设笔尖已经在内存中,而不是在磁盘上)。从笔尖实例化基本上只是我答案的后半部分,所以你只是添加了创建存档的额外工作
  • 好了,添加示例
【解决方案3】:

在回答迈克阿卜杜拉...问题是他需要保存他的图像视图中已经存在的所有子视图...

使用这种方法的问题是 NSCoding 的默认实现不会保存这些视图...所以他必须重写该方法并提供深度编码(对于这些努力,他最好遵守 NSCopying 并执行深度复制)

如果您只需要一张静态图片(子视图不提供交互),我建议您执行以下操作

UIGraphicsBeginImageContext(imageView.rect.size);

[imageView.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

UIImageView *copyImageView = [[UIImageView alloc] initWithImage:viewImage];

这将确保 tue 子视图全部保存为静态图像...

如果您需要一个具有保留其交互的子视图的副本...这对您没有帮助...

问候

【讨论】:

  • 我很确定你在这方面错了; UIViewNSCoding 的实现包括其所有子视图
  • 谢谢,你说得对,我把深度复制误认为是深度编码……谢谢指正
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 2017-12-11
  • 1970-01-01
  • 2021-06-25
  • 2017-02-19
相关资源
最近更新 更多