[英]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之前在接口构建器中设置的约束相同。 我的问题是:
我认为您可以像这样隐藏图像视图:
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.