我有一个通过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.
您可以尝试使用下面的 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)
当然。该文档提供了一个很好的示例,说明如何实现这一目标;这是为了UITableViewCell,但在这里也是一个很好的使用方法。
根据视图的复杂性,您可能希望将其设为自定义视图类,并IBOutlet为其拥有的任何子视图赋予其自己的属性;在这种情况下,您需要将 Interface Builder 中视图的 \xe2\x80\x9cClass Identity\xe2\x80\x9d 设置为该类。然后,您的视图控制器可以通过例如 来访问任何给定的 XIB 加载视图上的这些视图myLoadedView.someLabel,而不必使用例如[myLoadedView viewWithTag:3]前面链接的文档所建议的那样。
| 归档时间: |
|
| 查看次数: |
36312 次 |
| 最近记录: |