复制,克隆或复制UIView

时间:2011-02-15 13:12:09

标签: xcode ios

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

4 个答案:

答案 0 :(得分:30)

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

@implementation UIView (OPCloning)

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

@end

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

答案 1 :(得分:14)

以下是您可以使用的新方法:使用UIView的方法:

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

不确定。文档有good example of how to achieve that;它适用于UITableViewCell,但也是一种在这里使用的好方法。

根据视图的复杂程度,您可能希望将其设置为自定义视图类,并为其拥有的任何子视图提供自己的IBOutlet属性;在这种情况下,您将Interface Builder中的视图的“类标识”设置为该类。然后,您的视图控制器可以通过例如myLoadedView.someLabel访问任何给定的XIB加载视图上的那些视图,而不必像前面提到的文档所建议的那样使用例如[myLoadedView viewWithTag:3]