2016-07-18 7 views
0

Ich möchte eine UIView in eine andere Ansicht kopieren, ohne sie zu archivieren oder zu dearchivieren. Bitte helfen Sie mir, wenn Sie irgendeine Lösung haben.So kopieren Sie eine Ansicht in eine andere Ansicht in Swift

Ich habe versucht, indem Sie eine Erweiterung von UIView als bereits verfügbar eine Antwort auf Stack over Flow. Aber es stürzt ab, wenn ich die Ansicht mit der Hintergrundfarbe des Musters passiere.

extension UIView 
{ 
    func copyView() -> UIView? 
    { 
     return NSKeyedUnarchiver.unarchiveObjectWithData(NSKeyedArchiver.archivedDataWithRootObject(self)) as? UIView 
    } 
} 

Ich habe gerade versucht, diesen einfachen Code in einem Spielplatz, dass die Kopie Ansicht Arbeiten zu überprüfen und es zeigt nicht die gleiche Ansicht: unten

+0

Können Sie den Link der Antwort hinzufügen, die Sie bereits versucht haben? – crisisGriega

+0

http://stackoverflow.com/questions/27121655/create-a-copy-of-a-uiview-in-swift –

+0

Erweiterung UIView { func copyView() -> ANYOBJECT { return NSKeyedUnarchiver.unarchiveObjectWithData (NSKeyedArchiver .archivedDataWithRootObject (self))! } } –

Antwort

0
func copyView(viewforCopy: UIView) -> UIView { 
     viewforCopy.hidden = false //The copy not works if is hidden, just prevention 
     let viewCopy = viewforCopy.snapshotViewAfterScreenUpdates(true) 
     viewforCopy.hidden = true 
     return viewCopy 
    } 
+1

Dies kopiert nicht die Ansicht mit ihrer Live-Hierarchie. Es erzeugt ein statisches Bild der Ansicht zu dem Zeitpunkt, an dem 'snapshotView ...' aufgerufen wurde. –

2

Der Code auf meinen Kommentar im Zusammenhang

let originalView = UIView(frame: CGRectMake(0, 0, 100, 50)); 
originalView.backgroundColor = UIColor.redColor(); 
let originalLabel = UILabel(frame: originalView.frame); 
originalLabel.text = "Hi"; 
originalLabel.backgroundColor = UIColor.whiteColor(); 
originalView.addSubview(originalLabel); 

let copyView = originalView.copyView(); 
let copyLabel = copyView?.subviews[0] as! UILabel; 

originalView.backgroundColor = UIColor.blackColor(); 
originalLabel.text = "Hola"; 

originalView.backgroundColor; // Returns black 
originalLabel.text;    // Returns "Hola" 
copyView!.backgroundColor;  // Returns red 
copyLabel.text;     // Returns "Hi" 

Wenn die Erweiterung nicht funktionieren würde, beide copyView und originalView müssten gleiche backgroundColor und diese an den Text der Etiketten passieren würde. Vielleicht besteht also die Möglichkeit, dass das Problem in einem anderen Teil liegt.

+0

es funktioniert auch nicht. –

+0

Ich habe es einfach auf einem Spielplatz überprüft und die Kopie funktioniert gut. So habe ich gerade meine Antwort mit dem Code aktualisiert, den ich verwendete, falls Sie es nützlich finden können – crisisGriega

+0

Nehmen Sie nicht feste Farbe .... verwenden Sie etwas Bild für Hintergrundfarbe. Dann funktioniert es nicht. –