2011-01-07 14 views
10

¿Cómo creo una copia de una instancia de UIImageView que se puede manipular independientemente de la primera instancia?¿Cómo se crea una copia de una instancia de UIImageView?

He intentado UIImageView *tempCopy = [instance copy] pero se cuelga. ¿Hay otra manera?

+0

¿seguro que no desea que el UIImage que representa? –

+0

UIImageView es una serie de UIButtons, ¿puedo tratarlos como un UIImage del UIImageView? – John

Respuesta

14

Probablemente se bloquea porque UIImageView no se ajusta al protocolo NSCopying. Hágalo usted mismo: cree una instancia de UIImageView nueva y configure cualquier propiedad de su original que le interese.

+0

¿Hay alguna forma de copiar todas las propiedades? Lo que estoy copiando es un objeto extremadamente elaborado – John

+0

Howcome? Son solo unos pocos valores que debe asignar y listo. – mvds

+0

Lo que intento copiar son todas las subvistas, ¿hay alguna manera fácil que yo no sepa? – John

6

UIImageView no se ajusta a NSCopying, pero se ajusta a NSCoding. Archive su vista y luego déjela archivada para obtener una nueva copia.

Para el perezosamente inclinado, esto se parece a:

NSData *archive = [NSKeyedArchiver archivedDataWithRootObject:imageView]; 
UIImageView *copy = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
+0

¿alguien puede comentar sobre el rendimiento de esto? – ninjaneer

+0

Está buscando aproximadamente el doble del tiempo que lleva cargar una plumilla (suponiendo que la punta ya está en la memoria, en lugar de en el disco). La instanciación desde una punta es básicamente la segunda mitad de mi respuesta, por lo que solo está agregando el trabajo adicional de crear el archivo –

+0

¿Hay algún código de muestra para esto? –

-1

En respuesta a la respuesta de Mike Abdullah ... la cuestión es que se necesita para salvar a todos los subvistas ya existentes en su vista de la imagen .. .

el problema de utilizar ese enfoque es que la implementación predeterminada de NSCoding no guardará esas vistas ... por lo que tendría que anular el método y proporcionar una codificación profunda (para esos esfuerzos, se ajusta mejor a NSCopying y realiza la copia profunda)

Si todo lo que necesita es una imagen estática (los subvistas no proporcionan la interacción) Yo recomendaría hacer lo siguiente

UIGraphicsBeginImageContext(imageView.rect.size); 

[imageView.layer renderInContext:UIGraphicsGetCurrentContext()]; 

UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

UIImageView *copyImageView = [[UIImageView alloc] initWithImage:viewImage]; 

Esto asegurará que los subvistas tue obtener todos guardan como una imagen estática ...

si necesita una copia que tiene las subvistas que conservan su interacción ... esto no le ayudaría ...

saludos

+0

Estoy bastante seguro de que está equivocado en ese frente; La implementación de 'NSCoding' de UIView' incluye todas sus sub-vistas –

+0

Gracias, tienes razón, confundí la copia profunda con deep codying ... gracias por la corrección –

Cuestiones relacionadas