2010-01-25 15 views
9

मुझे इसके सबव्यू के साथ दृश्य को डुप्लिकेट करने की आवश्यकता है।UIView डुप्लिकेट

क्या कोई जानता है कि यह कैसे करें?

उत्तर

23

सबसे आसान (लेकिन शायद नहीं सबसे तेजी से) जिस तरह से एक NSData वस्तु और यह असंग्रहित तुरंत में संग्रह करने के लिए है।

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

दुर्भाग्य से, यह आपके विचार किसी भी subviews/वस्तुएं हैं, तो काम नहीं करेगा:

#import <UIKit/UIKit.h> @interface MyCustomView : UIView @property (weak, nonatomic) IBOutlet UILabel *lbl1; @property (weak, nonatomic) IBOutlet UIButton *btnBack; -(MyCustomView*)aCopy; @end 

ViewController.m में कस्टम दृश्य पुन: उपयोग का नमूना जिसे संग्रहीत नहीं किया जा सकता है (जैसे UIImage)। – rcw3

+0

तो आप कह रहे हैं कि यह UIImageViews के लिए काम नहीं करेगा? – fatuhoku

+1

@fatuhoku, हां, यह 'UIImageView के –

3

संग्रह करने के लिए किसी भी UIImage उद्देश्य केवल एक और (उदाहरण के लिए पीएनजी) और संग्रह एक प्रकार का एक imagerep या कि NSData वस्तु, तो असंग्रहित में आप UIImage imageWithData साथ बहाल करने के लिए उन्हें बदलने:

0

यहाँ एक नई विधि है जिसका आप उपयोग कर सकते हैं: UIView की विधि का उपयोग करें:

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates 

यह देखने के लिए सबसे तेज़ तरीका है। आईओएस 7 में उपलब्ध।

0

कोई आसानी से संग्रह और अनारक प्रक्रिया द्वारा 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} 

Refrence from here.

0

स्विफ्ट संस्करण

इस उत्तर कैसे एक ही बात करने के लिए पता चलता स्विफ्ट में स्वीकार्य उत्तर उद्देश्य-सी में करता है।

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

अधिक नोट्स के साथ मेरा पूरा उत्तर here है।

0

enter image description here

आप ViewController रूट दृश्य के बाहर अपने कस्टम दृश्य खींच सकते हैं। कस्टम व्यू क्लास के कार्यान्वयन में, enconde/decode विधियों को ओवरराइड करें। आईबीओटलेट्स और आईबीएक्शन कनेक्शन को समझें स्मृति में संग्रहीत नहीं किया जाएगा।

@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 "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