¿Se puede copyr UIView?

Simplemente usando esta forma

UIView* view2 = [view1 copy]; //view1 existed 

Esto hará que el simulador no pueda iniciar esta aplicación.

Intenta retener,

 UIView* view2 = [view1 retain]; //view1 existed //modify view2 frame etc 

Cualquier modificación de view2 se aplicará a view1, entiendo que view2 comparte la misma memory con view1.

¿Por qué no se puede copyr UIView ? ¿Cual es la razon?

Probablemente su aplicación se cuelgue con algo como:

  [UIView copyWithZone:]: unrecognized selector sent to instance 0x1c6280 

La razón es que UIView no implementa el protocolo de copy y, por lo tanto, no hay copyWithZone selector copyWithZone en UIView.

esto podría funcionar para usted … archive la vista y luego desarchivela justo después. Esto debería darle una copy profunda de una vista:

 id copyOfView = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]]; 

Puede hacer una extensión UIView. En el ejemplo de fragment rápido a continuación, la function copyView devuelve un AnyObject para que pueda copyr cualquier subclass de una UIView, es decir , UIImageView. Si desea copyr solo UIViews, puede cambiar el tipo de retorno a UIView.

 //MARK: - UIView Extensions extension UIView { func copyView<T: UIView>() -> T { return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self)) as! T } } 

Ejemplo de uso:

 let sourceView = UIView() let copiedView = sourceView.copyView() 

para swift3.0.1:

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

UIView no implementa el protocolo NSCoping , vea la statement en UIView.h :

@interface UIView : UIResponder <NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusEnvironment>

Entonces, si queremos tener una copy como método, necesitamos implementar el protocolo NSCoping en una categoría más o less.

Puedes hacer un método como este:

 -(UILabel*)copyLabelFrom:(UILabel*)label{ //add whatever needs to be copied UILabel *newLabel = [[UILabel alloc]initWithFrame:label.frame]; newLabel.backgroundColor = label.backgroundColor; newLabel.textColor = label.textColor; newLabel.textAlignment = label.textAlignment; newLabel.text = label.text; newLabel.font = label.font; return [newLabel autorelease]; } 

Luego puede establecer su ivar en el valor devuelto y retenerlo como sigue:

 myLabel = [[self copyLabelFrom:myOtherLabel] retain];