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. Texto duplicado en UITableView
- 4. Xcode, símbolo duplicado _principal
- 5. XSLT: Combinar escenario duplicado
- 6. ld: símbolo duplicado
- 7. Prólogo: primer valor duplicado
- 8. Accesibilidad símbolo duplicado
- 9. Duplicado devuelto por Guid.NewGuid()?
- 10. error de símbolo duplicado C++
- 11. Evitar el código duplicado (PHP)
- 12. ¿Cómo eliminar el código duplicado?
- 13. ID de duplicado de MySQL
- 14. Archivo duplicado .java en Eclipse
- 15. ¿tipo MIME duplicado "text/html"?
- 16. ID duplicado dentro de noscript
- 17. Archivo duplicado en Amazon S3
- 18. Javascript/jQuery Buscar texto duplicado
- 19. Eliminando código duplicado en python
- 20. duplicado en cada línea VI
- 21. Método duplicado 'ProcessRequest' en ASPX
- 22. error en csproj - elemento duplicado
- 23. Sección UITableView Encabezado de sección personalizada, problema duplicado
- 24. Deslizando una UIView para superponer parcialmente otra UIView
- 25. Force UIView/UIVIewController orientation
- 26. Eventos para UIView personalizado
- 27. UIView con sombra
- 28. Arrastrar UIView entre UIViews
- 29. UIView shadow y InterfaceBuilder
- 30. Mover UIView con desaceleración
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 –