在某些效果中,我们需要在当前视图上创建一个新的、一样的视图,并且叠在老的上面,然后让新的视图移动、缩放等等,这样做出来的动画看起来比较流畅。
对于简单的界面,我们可能按原有的样子重写一个新的就好,但对于复杂的界面,有没有更好更通用的办法呢?
UIView
无法通过copy
来创建一个新副本,这个大家都已经试过了。
而UIView
是遵守NSCoding协议的,这样它才能从Xib
中反序列化出来,而我们最常用的一个序列化类就是NSKeyedArchiver
。
所以可以通过解归档方式来完全复制一个UIView的
新副本:
- (UIView *)copyView:(UIView *)view {
return [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:view]];
}