复制,克隆或复制UIView

Thy*_*hys 23 xcode ios

我有一个通过Interface Builder链接到UIViewController的UIView.是否可以复制,克隆或复制此视图,以便我可以多次使用它?

osx*_*irk 30

以下类别可能效率不高,但在一个项目中为我工作:

@implementation UIView (OPCloning)

- (id) clone {
    NSData *archivedViewData = [NSKeyedArchiver archivedDataWithRootObject: self];
    id clone = [NSKeyedUnarchiver unarchiveObjectWithData:archivedViewData];
    return clone;
}

@end
Run Code Online (Sandbox Code Playgroud)

我不会实现-copy或-copyWithZone:因为Apple将来可能会这样做.请注意,并非所有视图都实现了相同范围的归档.您肯定需要为要克隆的NSView子类的自定义属性实现NSCoding方法(否则将在克隆视图中变为nil).比编写自定义克隆代码更容易.


Lei*_*ang 15

这是一个可以使用的新方法:使用UIView的方法:

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates
Run Code Online (Sandbox Code Playgroud)

这是绘制视图的最快方法.适用于iOS 7.


Sou*_*ean 5

您可以尝试使用下面的 Swift 3.0.1:

extension UIView{
func copyView() -> AnyObject{
    return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self))! as AnyObject
 }
}
Run Code Online (Sandbox Code Playgroud)


Noa*_*oon 0

当然。该文档提供了一个很好的示例,说明如何实现这一目标;这是为了UITableViewCell,但在这里也是一个很好的使用方法。

\n\n

根据视图的复杂性,您可能希望将其设为自定义视图类,并IBOutlet为其拥有的任何子视图赋予其自己的属性;在这种情况下,您需要将 Interface Builder 中视图的 \xe2\x80\x9cClass Identity\xe2\x80\x9d 设置为该类。然后,您的视图控制器可以通过例如 来访问任何给定的 XIB 加载视图上的这些视图myLoadedView.someLabel,而不必使用例如[myLoadedView viewWithTag:3]前面链接的文档所建议的那样。

\n

  • 我的猜测是@geon建议,虽然通过多次取消归档笔尖来创建新对象似乎可以解决OP的需求,但它并不能作为问题标题所暗示的问题的通用解决方案。这在代码中创建的 UIView 的一般情况下不起作用,例如使用“[UIView alloc] initWithFrame:aFrame];”。答案是正确的,但问题标题具有误导性。 (9认同)
  • UITableViewCell 仅加载几次,从未克隆。 (2认同)