¿Se puede copiar 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 a view2 se aplicará a view1 , entiendo que view2 comparta la misma memoria con view1 .

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

Tu aplicación probablemente se cuelga con algo como:

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

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

esto podría funcionar para usted … archivar la vista y luego desarchivarla inmediatamente después. Esto debería darle una copia profunda de una vista:

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

Puede hacer una extensión UIView. En el siguiente fragmento rápido, la función copyView devuelve AnyObject para que pueda copiar cualquier subclase de UIView, es decir , UIImageView. Si desea copiar solo UIViews, puede cambiar el tipo de devolución a UIView.

 //MARK: - UIView Extensions extension UIView { func copyView() -> 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 , consulte la statement en UIView.h :

@interface UIView : UIResponder

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

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 configurar su ivar para el valor de retorno y retenerlo así:

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