Tengo una UIView que está vinculada a un UIViewController a través del Interface Builder. ¿Es posible duplicar, clonar o copiar esta vista para poder usarla más de una vez?Duplicar, clonar o copiar UIView
Respuesta
Sure. La documentación tiene un good example of how to achieve that; es para UITableViewCell
, pero es un buen enfoque para usar aquí también.
Dependiendo de la complejidad de su vista, es posible que desee convertirla en una clase de vista personalizada y otorgarle sus propias propiedades IBOutlet
para las subvistas que tenga; en ese caso, establecería la "Identidad de clase" de la vista en el Creador de interfaz para esa clase. Entonces su controlador de vista podría acceder a esas vistas en cualquier vista cargada XIB dada, por ejemplo, myLoadedView.someLabel
, en lugar de tener que usar, por ejemplo, [myLoadedView viewWithTag:3]
como lo sugiere la documentación anteriormente mencionada.
El UITableViewCell sólo es cargado varias veces, nunca clonado. – geon
La diferencia es? –
Supongo que @geon está sugiriendo que, aunque crear un objeto nuevo al desarchivar un plumín varias veces parece resolver las necesidades del OP, no sirve como una solución general al problema, como lo implica el título de la pregunta. Esto no funcionará en el caso general de una UIView creada en código, por ejemplo, con '[UIView alloc] initWithFrame: aFrame];'. La respuesta es correcta, pero el título de la pregunta es engañoso. – clozach
La siguiente categoría podría no ser particularmente eficiente, pero trabajó para mí en un proyecto:
@implementation UIView (OPCloning)
- (id) clone {
NSData *archivedViewData = [NSKeyedArchiver archivedDataWithRootObject: self];
id clone = [NSKeyedUnarchiver unarchiveObjectWithData:archivedViewData];
return clone;
}
@end
yo no había implemento de la copia o -copyWithZone: como Apple podría hacerlo en el futuro. Tenga en cuenta que no todas las vistas implementan el archivo en la misma medida. Definitivamente tendrá que implementar los métodos de NSCoding para clonar las propiedades personalizadas de sus subclases NSView (de lo contrario, se convertirá en nil en la vista clonada). Aún más fácil que escribir código de clonación personalizado.
Debería ser más eficiente que cargar varias veces un plumín para eso, ya que no tiene acceso al almacenamiento externo. – osxdirk
En mi caso, archivar y desarchivar en conjunto llevó entre un 20% y un 25% más de tiempo que la carga del paquete (almacenamiento externo). De todos modos, todavía estoy buscando la manera de mejorar el rendimiento de loadNibNamed. –
Las imágenes de la vista clonada se están cargando demasiado lento en iOS 9. – Suresh
Aquí es un nuevo método que puede utilizar: Método de Uso UIView:
- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates
Esta es la manera más rápida para dibujar una vista. Disponible en iOS 7.
Nota: Si bien esta es una buena solución para un caso de uso muy específico, este método en realidad no crea una nueva vista del mismo tipo que el original. Solo crea una vista que parece que la vista mira en este momento (es decir, "toma una captura de pantalla" de la vista), que puede usar como suplente, p. durante los efectos de transición o al volver a cargar/recrear vistas. – uliwitness
Usted puede tratar con Swift 3.0.1 a continuación:
extension UIView{
func copyView() -> AnyObject{
return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self))! as AnyObject
}
}
- 1. ¿Cómo puedo copiar clonar/duplicar una carpeta en S3?
- 2. Clon o Copiar UIViewController o UIView
- 3. Android: Copiar/Duplicar SharedPreferences
- 4. ¿Cómo puedo encontrar el código copiar/pegar (duplicar, clonar) en Perl?
- 5. Clonar/Duplicar/Copiar un grupo de aplicaciones existente en IIS 7
- 6. ¿Cómo puedo copiar y pegar, o duplicar, un proyecto existente?
- 7. Cómo copiar o duplicar una matriz de matrices
- 8. ¿Se puede copiar UIView?
- 9. Copiar/duplicar base de datos sin usar mysqldump
- 10. ¿Cómo puedo duplicar (clonar) una pestaña en IntelliJ Idea?
- 11. ¿Es posible copiar CALayer de UIView?
- 12. Cómo clonar/copiar un control (con controles secundarios) usando asp.net?
- 13. ArrayList copia superficial iterar o clonar()
- 14. Cómo copiar/clonar un entorno virtual desde el servidor web
- 15. Duplicar/Copiar registros en la misma tabla MySQL
- 16. ¿Clonar un registro en rieles, es posible clonar asociaciones y copiar en profundidad?
- 17. ¿Cuál es la diferencia entre copiar y clonar?
- 18. Clonar() vs Copiar constructor - que se recomienda en java
- 19. ¿SQLDeveloper tiene una herramienta para copiar/clonar usuarios como Toad?
- 20. Clonar/copiar una variable de mapa de Javascript
- 21. Esquinas redondeadas UIView o UIImageView
- 22. ¿Cuál es la mejor manera de clonar/duplicar un proyecto en un nuevo con git?
- 23. Duplicar un QWidget
- 24. Cómo duplicar un archivo .xib?
- 25. Duplicar un registro en MySQL
- 26. Anular copiar o copiarWithZone: ¿o ambos?
- 27. Clonar el control Winform
- 28. C# clonar una pila
- 29. UIView duplicado
- 30. Propiedad NSArray: ¿copiar o conservar?
[respuesta Swift] (http://stackoverflow.com/a/37050633/3681880) – Suragch