Respuesta
La manera más fácil (pero probablemente no la más rápida) es archivarla en un objeto NSData y desarchivarla de inmediato.
NSData *tempArchive = [NSKeyedArchiver archivedDataWithRootObject:myView];
UIView *myViewDuplicate = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchive];
Para archivar cualquier objeto UIImage simplemente convertir a un imagerep de un tipo u otro (PNG, por ejemplo) y archivo de ese objeto NSData, a continuación, en el desarchivar que restaurar el UIImage con imageWithData:
Aquí es un nuevo método que puede usar: Use el método de UIView:
- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates
Esta es la forma más rápida de dibujar una vista. Disponible en iOS 7.
Se puede copiar fácilmente una UIView archivando y desarchivando el proceso.
NSData *tempArchive = [NSKeyedArchiver archivedDataWithRootObject:myView];
UIView *myViewDuplicate = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchive];
Pero esto ignora UIImageView, por lo que para UIImageView hacerlo de esta manera,
UIImage *img = [UIImage imageNamed: @"myImage"];
UIImage *img2 = [UIImage imageWithCGImage:img.CGImage scale:img.scale orientation:img.imageOrientation];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:img2];
UIImage *imgCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSLog(@"%@, %@", imgCopy, NSStringFromCGSize(imgCopy.size)); // -> <UIImage: 0x7fa013e766f0>, {50, 53}
versión Swift
Esta respuesta muestra cómo hacer la misma cosa en Swift como lo hace la respuesta aceptada en Objective-C.
let tempArchive = NSKeyedArchiver.archivedDataWithRootObject(myView)
let myViewDuplicate = NSKeyedUnarchiver.unarchiveObjectWithData(tempArchive) as! UIView
Mi respuesta completa con más notas es here.
Puede arrastrar la vista personalizada fuera de la vista raíz de la viewController. En la implementación de la clase de vista personalizada, anule los métodos de enconde/decode. Tenga en cuenta que las conexiones IBOutlet e IBActions no se archivarán en la memoria.
@implementation MyCustomView
-(MyCustomView*)aCopy{
NSData *temp = [NSKeyedArchiver archivedDataWithRootObject:self];
return [NSKeyedUnarchiver unarchiveObjectWithData:temp];
}
- (void)encodeWithCoder:(NSCoder *)coder {
[super encodeWithCoder:coder];
[coder encodeObject:self.btnBack forKey:@"btnBack"];
[coder encodeObject:self.lbl1 forKey:@"lbl1"];
}
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
if (self) {
self.btnBack = [aDecoder decodeObjectForKey:@"btnBack"];
self.lbl1 = [aDecoder decodeObjectForKey:@"lbl1"];
[_btnBack addTarget:self action:@selector(onBtnBack) forControlEvents:UIControlEventTouchUpInside];
}
return self;
}
- (IBAction)onBtnBack{
//. . .
MyCustomView.h:
#import <UIKit/UIKit.h>
@interface MyCustomView : UIView
@property (weak, nonatomic) IBOutlet UILabel *lbl1;
@property (weak, nonatomic) IBOutlet UIButton *btnBack;
-(MyCustomView*)aCopy;
@end
Muestra de reutilizar la vista personalizada en ViewController.m:
#import "ViewController.h"
#import "MyCustomView.h"
@interface ViewController()
@property (strong, nonatomic) IBOutlet MyCustomView *myCustomView;
@property (weak, nonatomic) IBOutlet UIView *vwPlaceHolder;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:_myCustomView];
}
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
MyCustomView *vwCopy = [_myCustomView aCopy];
vwCopy.lbl1.text = @"My other msg";
vwCopy.frame = _vwPlaceHolder.frame;
[_vwPlaceHolder removeFromSuperview];
[self.view addSubview:vwCopy];
}
@end
- 1. definición # duplicado
- 2. iOS - Error del enlazador, símbolo duplicado
- 3. Accesibilidad símbolo duplicado
- 4. Xcode, símbolo duplicado _principal
- 5. Texto duplicado en UITableView
- 6. Duplicado devuelto por Guid.NewGuid()?
- 7. Prólogo: primer valor duplicado
- 8. ld: símbolo duplicado
- 9. XSLT: Combinar escenario duplicado
- 10. error en csproj - elemento duplicado
- 11. ID duplicado dentro de noscript
- 12. Evitar el código duplicado (PHP)
- 13. Eliminando código duplicado en python
- 14. error de símbolo duplicado C++
- 15. ¿tipo MIME duplicado "text/html"?
- 16. Archivo duplicado en Amazon S3
- 17. Archivo duplicado .java en Eclipse
- 18. duplicado en cada línea VI
- 19. ¿Cómo eliminar el código duplicado?
- 20. Método duplicado 'ProcessRequest' en ASPX
- 21. Javascript/jQuery Buscar texto duplicado
- 22. ID de duplicado de MySQL
- 23. Sección UITableView Encabezado de sección personalizada, problema duplicado
- 24. Deslizando una UIView para superponer parcialmente otra UIView
- 25. ¿Se puede copiar UIView?
- 26. creando uiview mediante programación?
- 27. UIView shadow no funciona
- 28. UIView animación vs CALayers
- 29. Deslice UIView usando kCATransitionPush
- 30. Animar UIView frame.origin
Desafortunadamente, esto no va a funcionar si su punto de vista tiene ningún subvistas/objetos que no se puede archivar (como un UIImage). – rcw3
¿Estás diciendo que esto no funcionará para UIImageViews? – fatuhoku
@fatuhoku, sí, no funciona para 'UIImageView's –