所以我在界面构建器(XCode 6)中设置了3个视图。它们与拥有它们的ViewController
相关联。我的项目中还有3个UIVIew
子类。在运行时,我需要将其中一个视图的类从UIView
更改为我的自定义视图子类。
我如何在swift中执行此操作? (我需要在IB中设置的所有autolayout
在更改后都能正常工作。)
答案 0 :(得分:1)
要实现您的需求,您可以在IB中创建视图,稍后在代码中添加所需视图作为子视图。
要使添加的视图占据所有容器视图空间,您需要更新子视图框架或设置自动布局约束。每次容器视图改变其大小时,都需要重复具有框架的变体。代码如下:
override func viewDidLoad() {
super.viewDidLoad()
self.myView = UIView(frame: CGRect())
self.myView.setTranslatesAutoresizingMaskIntoConstraints(false)
self.myViewContainer.addSubview(self.myView)
self.myViewContainer.addConstraint(NSLayoutConstraint(item: self.myView, attribute: .Top, relatedBy: .Equal, toItem: self.myViewContainer, attribute: .Top, multiplier: 1.0, constant: 0))
self.myViewContainer.addConstraint(NSLayoutConstraint(item: self.myView, attribute: .Right, relatedBy: .Equal, toItem: self.myViewContainer, attribute: .Right, multiplier: 1.0, constant: 0))
self.myViewContainer.addConstraint(NSLayoutConstraint(item: self.myView, attribute: .Bottom, relatedBy: .Equal, toItem: self.myViewContainer, attribute: .Bottom, multiplier: 1.0, constant: 0))
self.myViewContainer.addConstraint(NSLayoutConstraint(item: self.myView, attribute: .Left, relatedBy: .Equal, toItem: self.myViewContainer, attribute: .Left, multiplier: 1.0, constant: 0))
}
@IBOutlet var myViewContainer: UIView
var myView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
self.myView = UIView(frame: CGRect())
self.myViewContainer.addSubview(self.myView)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.myView.frame = self.myViewContainer.bounds
}
即使容器视图具有自动布局约束,也可以进行帧更新。