2010-01-25 12 views
9

Necesito duplicar una vista, con todas sus subvistas.UIView duplicado

¿Alguien sabe cómo hacerlo?

Respuesta

23

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]; 
+11

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

+0

¿Estás diciendo que esto no funcionará para UIImageViews? – fatuhoku

+1

@fatuhoku, sí, no funciona para 'UIImageView's –

3

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:

0

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.

0

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} 

Refrence from here.

0

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.

0

enter image description 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