如何在 Swift 中将一个视图复制到另一个视图

Posted

技术标签:

【中文标题】如何在 Swift 中将一个视图复制到另一个视图【英文标题】:how to copy one view to another view in Swift 【发布时间】:2016-07-18 10:48:17 【问题描述】:

我想将一个 UIView 复制到另一个视图而不使其存档或取消存档。 如果您有任何解决方案,请帮助我。

我尝试通过扩展 UIView 来作为 Stack over flow 的答案。但是当我通过带有图案图像背景颜色的视图时,它会崩溃。

【问题讨论】:

可以添加你已经尝试过的答案的链接吗? ***.com/questions/27121655/… extension UIView func copyView() -> AnyObject return NSKeyedUnarchiver.unarchiveObjectWithData(NSKeyedArchiver.archivedDataWithRootObject(self))! 我认为您忘记将从copyView 返回的对象转换为UIView。如果是这种情况,您可以让copyView 返回UIView?,这样就不需要稍后再进行转换 【参考方案1】:

下面与我的评论相关的代码:

extension UIView

    func copyView() -> UIView?
    
        return NSKeyedUnarchiver.unarchiveObjectWithData(NSKeyedArchiver.archivedDataWithRootObject(self)) as? UIView
    

我刚刚在 Playground 中尝试了这个简单的代码来检查复制视图是否有效并且它没有指向同一个视图:

let originalView = UIView(frame: CGRectMake(0, 0, 100, 50));
originalView.backgroundColor = UIColor.redColor();
let originalLabel = UILabel(frame: originalView.frame);
originalLabel.text = "Hi";
originalLabel.backgroundColor = UIColor.whiteColor();
originalView.addSubview(originalLabel);

let copyView = originalView.copyView();
let copyLabel = copyView?.subviews[0] as! UILabel;

originalView.backgroundColor = UIColor.blackColor();
originalLabel.text = "Hola";

originalView.backgroundColor;   // Returns black
originalLabel.text;             // Returns "Hola"
copyView!.backgroundColor;      // Returns red
copyLabel.text;                 // Returns "Hi"

如果扩展不起作用,copyVieworiginalView 将具有相同的backgroundColor,并且标签的文本也会发生相同的情况。所以也许问题出在其他部分。

【讨论】:

我刚刚在 Playground 中仔细检查了它,副本工作正常。所以我刚刚用我使用的代码更新了我的答案,以防你觉得它有帮助 不要采用固定颜色....使用一些图像作为背景颜色。然后它不工作。 哦,对了,对不起。那么您的问题不是复制 UIView 而是在从模式创建 UIColor 时对其进行编码。您可以找到解决该问题的方法here【参考方案2】:

原帖

   func copyView(viewforCopy: UIView) -> UIView 
        viewforCopy.hidden = false //The copy not works if is hidden, just prevention
        let viewCopy = viewforCopy.snapshotViewAfterScreenUpdates(true)
        viewforCopy.hidden = true
        return viewCopy
    

为 Swift 4 更新

func copyView(viewforCopy: UIView) -> UIView 
    viewforCopy.isHidden = false //The copy not works if is hidden, just prevention
    let viewCopy = viewforCopy.snapshotView(afterScreenUpdates: true)
    viewforCopy.isHidden = true
    return viewCopy!

【讨论】:

这不会复制具有实时层次结构的视图。它会在调用 snapshotView... 时生成视图的静态图片。

以上是关于如何在 Swift 中将一个视图复制到另一个视图的主要内容,如果未能解决你的问题,请参考以下文章

使用 Segue 在 Swift 中将带有数据的对象从一个视图传递到另一个视图

在 Swift 中将图像视图从一个视图控制器转移到另一个视图控制器

如何在swift 4中将按钮放在表格视图控制器的前面? [复制]

如何在 Jenkins 中将现有工作从一个视图移动到另一个视图?

如何在 SwiftUI 中将数据从视图传递到另一个视图?

如何在没有 segue 的情况下在 Swift 3 中将数据从 VC 传递到另一个?