Ios 当superview完成加载时调整子视图的大小

Ios 当superview完成加载时调整子视图的大小,ios,swift,subview,childviewcontroller,Ios,Swift,Subview,Childviewcontroller,我知道在这方面有无数类似的问题,要么都导致使用灵活的高度/宽度,要么将TranslatesAutoResizengMaskintoConstraints设置为false 我已使用我创建的扩展添加了一个视图: extension UIView { func addView(storyboard: String, viewIdentier: String) { let story = UIStoryboard(name: storyboard, bundle: nil)

我知道在这方面有无数类似的问题,要么都导致使用灵活的高度/宽度,要么将TranslatesAutoResizengMaskintoConstraints设置为false

我已使用我创建的扩展添加了一个视图:

extension UIView {
    func addView(storyboard: String, viewIdentier: String) {
        let story = UIStoryboard(name: storyboard, bundle: nil)
        let subview = story.instantiateViewController(withIdentifier: viewIdentifier)
        subview.view.frame = self.bounds
        self.addSubview(subview.view)
    }
}
如果我用它初始化视图,在视图中,一切都正常。但是,如果视图中的约束确实已加载,则约束到处都是,因为包含该视图的contrainView有其自身的约束尚未加载

我目前使用的方法如下:

@IBOutlet weak var container: UIView!

override func viewDidLoad() {
    container.addView(storyboard: "Modules", viewIdentifier: "subview")
}
由于各种原因,我不想在视图中初始化视图。有没有办法解决这个问题,使其按预期工作?还是在加载superview后重新加载子视图约束


此外,我还尝试过使用其他解决方案。我做不到这一点,所以我非常感谢你的帮助

没有办法按照代码建议的硬编码方式做事。您正在根据
self.bounds
设置子视图的框架。但是在
viewDidLoad
中,我们还不知道
self.bounds
的最终值。太早了

取决于了解布局值的适当位置是在布局发生后,即在
viewdlayoutsubviews
中。请注意,在应用程序的生命周期中,这可能会被多次调用;您不希望每次都再次添加子视图,因此请使用Bool标志确保只添加一次子视图。在随后调整superview的大小时,您可能需要在
viewDidLayoutSubviews
中执行其他操作,以便对子视图进行适当的调整


但正确的方法是添加子视图(可能在
viewdiload
中)并对其进行约束,这样无论何时以及如何调整超级视图的大小,其框架都将相对于其超级视图保持正确。在你的问题中,你似乎立即拒绝了这种方法,但这是正确的做法,你应该放弃对它的抵制。

哈哈!好的,马特。谢谢你的建议。我有一种感觉,那将是答案。我有一种感觉,你有那种感觉…!:)但我希望至少现在你明白为什么你的方式注定要失败,为什么正确的方式是配置某种实时响应来调整大小。