मुझे इसके सबव्यू के साथ दृश्य को डुप्लिकेट करने की आवश्यकता है।UIView डुप्लिकेट
क्या कोई जानता है कि यह कैसे करें?
मुझे इसके सबव्यू के साथ दृश्य को डुप्लिकेट करने की आवश्यकता है।UIView डुप्लिकेट
क्या कोई जानता है कि यह कैसे करें?
सबसे आसान (लेकिन शायद नहीं सबसे तेजी से) जिस तरह से एक NSData वस्तु और यह असंग्रहित तुरंत में संग्रह करने के लिए है।
NSData *tempArchive = [NSKeyedArchiver archivedDataWithRootObject:myView];
UIView *myViewDuplicate = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchive];
संग्रह करने के लिए किसी भी UIImage उद्देश्य केवल एक और (उदाहरण के लिए पीएनजी) और संग्रह एक प्रकार का एक imagerep या कि NSData वस्तु, तो असंग्रहित में आप UIImage imageWithData साथ बहाल करने के लिए उन्हें बदलने:
यहाँ एक नई विधि है जिसका आप उपयोग कर सकते हैं: UIView की विधि का उपयोग करें:
- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates
यह देखने के लिए सबसे तेज़ तरीका है। आईओएस 7 में उपलब्ध।
कोई आसानी से संग्रह और अनारक प्रक्रिया द्वारा 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}
स्विफ्ट संस्करण
इस उत्तर कैसे एक ही बात करने के लिए पता चलता स्विफ्ट में स्वीकार्य उत्तर उद्देश्य-सी में करता है।
let tempArchive = NSKeyedArchiver.archivedDataWithRootObject(myView)
let myViewDuplicate = NSKeyedUnarchiver.unarchiveObjectWithData(tempArchive) as! UIView
अधिक नोट्स के साथ मेरा पूरा उत्तर 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
दुर्भाग्य से, यह आपके विचार किसी भी subviews/वस्तुएं हैं, तो काम नहीं करेगा:
ViewController.m में कस्टम दृश्य पुन: उपयोग का नमूना जिसे संग्रहीत नहीं किया जा सकता है (जैसे UIImage)। – rcw3
तो आप कह रहे हैं कि यह UIImageViews के लिए काम नहीं करेगा? – fatuhoku
@fatuhoku, हां, यह 'UIImageView के –