繁体   English   中英

以编程方式删除在界面生成器中设置的IBOutlet,并以相同的约束再次添加它

[英]Remove IBOutlet programmatically that is set in interface builder and add it again with same constraints

可以说我在.nib文件中有一个ViewController,其中IBOutlet imageView作为具有约束的子视图,该imageView连接到与该nib文件关联的ViewController类。 现在,我使用以下代码删除imageView:

imageView.removeFromSuperview()

然后,我想再次将其添加到ViewController视图中,约束与在删除imageView之前在接口构建器中设置的约束相同。 我的问题是:

  1. 是否可以在代码中执行此操作而无需再次初始化ViewController?
  2. 如果删除后以编程方式将imageView作为SubView添加到VC,则约束不再可用。 我真的很想跳过代码中再次设置约束,因为它们已经存在于接口构建器中,这可能吗?

我认为您可以像这样隐藏图像视图:

imageView.isHidden = true

要么

imageView.alpha = 0

否则,您可以将约束存储在某处,然后将其重新添加到适当的视图中。

一种方法是将约束保存在var中,然后以编程方式将其重新设置。 顺便说一下,由于IBOutlet很弱,一旦将其删除,就无法重新添加imageView。 因此,您必须维护一个强有力的参考。 同样,删除imageView将干扰具有依赖约束的其他视图。 但是,如果其他视图的约束独立于您的imageView,则不会有问题。
另一种方法是引用imageView的高度或宽度约束,并将其常数更改为零,以使其实际上从视图中消失。 这样,您只需要将约束更改回其原始值即可取消隐藏,并确保其他视图的约束自动调整。

从理论上讲,您可以在视图控制器中保存约束,然后再删除图像视图,如下所示:

let savedConstraints = view.constraints.filter { (constraint) -> Bool in
    constraint.firstItem as? UIView == myImageView || constraint.secondItem as? UIImageView == myImageView
}

... myImageView是要删除的图像视图。 上面的检查将读取连接到视图的约束,并返回连接到图像视图的约束。

然后,您可以在创建新的图像视图时重新添加这些约束:

let myNewImageView = UIImageView()
view.addSubview(myNewImageView)
savedConstraints.forEach { (constraint) in
    view.addConstraint(NSLayoutConstraint(
            item: view,
            attribute: constraint.firstAttribute,
            relatedBy: constraint.relation,
            toItem: myNewImageView,
            attribute: constraint.secondAttribute,
            multiplier: constraint.multiplier,
            constant: constraint.constant))
}

尽管我同意那些建议仅隐藏图像视图的评论者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM