2011-02-15 124 views
21

我有一個UIView通過接口生成器鏈接到UIViewController。 是否可以複製,複製或複製此視圖,以便我可以多次使用它?重複,克隆或複製UIView

+0

[斯威夫特答案】(http://stackoverflow.com/a/37050633/3681880) – Suragch 2016-05-05 12:57:47

回答

1

當然。該文檔有一個good example of how to achieve that;它適用於UITableViewCell,但這也是一個很好的方法。

根據視圖的複雜程度,您可能希望將其設置爲自定義視圖類,併爲其擁有的子視圖提供自己的IBOutlet屬性;在這種情況下,您應該在Interface Builder中將該視圖的「Class Identity」設置爲該類。然後,您的視圖控制器可以通過例如myLoadedView.someLabel訪問任何給定的XIB加載的視圖上的視圖,而不必使用上述文檔中建議的[myLoadedView viewWithTag:3]

+2

的UITableViewCell的只是加載幾次,從不克隆。 – geon 2011-06-13 13:49:34

+1

區別在哪裏? – 2011-06-13 15:20:59

+8

我的猜測是,@geon建議,通過多次解開筆記本來創建新對象似乎可以解決OP的需求,但它並不能解決問題標題所暗示的問題的一般解決方案。這在代碼中創建的UIView的一般情況下不起作用,例如,使用`[UIView alloc] initWithFrame:aFrame];`。答案是正確的,但問題標題的誤導。 – clozach 2011-11-30 04:57:01

30

以下類別可能不是特別有效,但在一個項目工作對我來說:

@implementation UIView (OPCloning) 

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

@end 

我沒有實現 - 複製或-copyWithZone:蘋果可能會在將來也會如此。請注意,並非所有視圖都將歸檔實現到相同的程度。您肯定需要爲要克隆的NSView子類的自定義屬性實現NSCoding方法(否則將在克隆視圖中變爲nil)。比編寫自定義克隆代碼更容易。

13

這裏是你可以用一種新的方法:使用的UIView的方法:

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates 

這是畫一個圖的最快方式。可在iOS的7

2

你可以用下面斯威夫特3.0.1嘗試:

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