UIView дубликат - PullRequest
       40

UIView дубликат

9 голосов
/ 25 января 2010

Мне нужно продублировать вид со всеми его подпредставлениями.

Кто-нибудь знает, как это сделать?

Ответы [ 6 ]

24 голосов
/ 25 января 2010

Самый простой (но, вероятно, не самый быстрый) способ - заархивировать его в объект NSData и сразу же разархивировать.

NSData *tempArchive = [NSKeyedArchiver archivedDataWithRootObject:myView];
UIView *myViewDuplicate = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchive];
3 голосов
/ 11 июня 2011

Чтобы заархивировать любой объект uiimage, просто преобразуйте их в imagerep того или иного вида (например, PNG) и заархивируйте этот объект NSData, а затем в архиве вы восстановите uiimage с помощью imageWithData:

0 голосов
/ 11 мая 2016

enter image description here

Вы можете перетащить свой пользовательский вид за пределы корневого представления viewController. В реализации пользовательского класса представления переопределите методы enconde / decode. Поймите, что соединения IBOutlets и IBActions не будут архивироваться в памяти.

@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

Пример повторного использования пользовательского представления в 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
0 голосов
/ 05 мая 2016

Swift версия

Этот ответ показывает, как сделать в Swift то же, что и принятый ответ в Objective-C.

let tempArchive = NSKeyedArchiver.archivedDataWithRootObject(myView)
let myViewDuplicate = NSKeyedUnarchiver.unarchiveObjectWithData(tempArchive) as! UIView

Мой полный ответ с дополнительными примечаниями: здесь .

0 голосов
/ 08 августа 2015

Можно легко скопировать UIView путем архивирования и разархивирования.

NSData *tempArchive = [NSKeyedArchiver archivedDataWithRootObject:myView];
UIView *myViewDuplicate = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchive];

Но это игнорирует UIImageView, поэтому для UIImageView сделайте это следующим образом,

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}

Ссылка отсюда.

0 голосов
/ 09 апреля 2015

Вот новый метод, который вы можете использовать: Используйте метод UIView:

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates

Это самый быстрый способ нарисовать вид. Доступно в iOS 7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...