【问题标题】:UIView duplicateUIView 重复
【发布时间】:2011-01-09 00:51:38
【问题描述】:

我需要复制一个视图及其所有子视图。

有人知道怎么做吗?

【问题讨论】:

    标签: ios objective-c uiview


    【解决方案1】:

    您可以将自定义视图拖到 viewController 的根视图之外。 在自定义视图类的实现中,重写编码/解码方法。意识到 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
    

    【讨论】:

      【解决方案2】:

      Swift 版本

      这个答案展示了如何在 Swift 中做与 Objective-C 中公认答案相同的事情。

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

      我的完整答案是here

      【讨论】:

        【解决方案3】:

        可以通过归档和取消归档过程轻松复制 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.

        【讨论】:

          【解决方案4】:

          这是一个你可以使用的新方法:使用 UIView 的方法:

          - (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates
          

          这是绘制视图的最快方法。在 iOS 7 中可用。

          【讨论】:

            【解决方案5】:

            要存档任何 uiimage 对象,只需将它们转换为一种或另一种图像(例如 PNG)并存档该 NSData 对象,然后在 unarchive 中使用 imageWithData 恢复 uiimage:

            【讨论】:

              【解决方案6】:

              最简单(但可能不是最快)的方法是将其归档到 NSData 对象中并立即取消归档。

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

              【讨论】:

              • 不幸的是,如果您的视图有任何无法归档的子视图/对象(例如 UIImage),这将不起作用。
              • 所以你是说这对 UIImageViews 不起作用?
              • @IulianOnofrei 你有没有找到任何解决方案在 UIView 实例中将它用于 UIImageView?
              • @AkshaySunderwani,不 :( 我确实找到了 [this library](UIView-Copy) 但我还没有测试它。如果你测试它是否有效,请告诉我。跨度>
              • @lulianOnofrei 我通过创建原始 UIView 的 CGImageRef(如果它是 UIImageView 类型)获得了 uiimage 视图的替代品,然后使用以下方法并将 CGImageRef 复制到副本或您的 UIView 副本。您可以从此答案stackoverflow.com/a/26214969/3824808 获得更多信息
              猜你喜欢
              • 1970-01-01
              • 2018-12-06
              • 2013-11-24
              • 2019-09-23
              • 2016-10-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多