超级视图完成加载时调整子视图的大小

Resize subview when superview finishes loading

我知道有无数类似的问题都导致使用灵活 height/width 或将 translatesAutoresizingMaskIntoConstraints 设置为 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)
    }
}

如果我使用它来初始化视图,在 ViewDidAppear 中一切正常。但是,如果它在视图中确实加载了,那么约束就会到处都是,因为包含视图的 contrainView 有自己的约束尚未加载。

我目前是这样使用的:

@IBOutlet weak var container: UIView!

override func viewDidLoad() {
    container.addView(storyboard: "Modules", viewIdentifier: "subview")
}

由于某些原因,我不想在 ViewDidAppear 中初始化视图。有什么办法可以解决这个问题,让它按预期工作吗?或者在父视图加载后重新加载子视图约束?

我也尝试过使用其他解决方案。我无法完成这项工作,因此非常感谢您的帮助。

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

做一些依赖于了解布局值的事情的适当位置是在布局发生之后,即 viewDidLayoutSubviews。请注意,在应用程序的生命周期中,这可能会被多次调用;你不想每次都添加子视图,所以使用 Bool 标志来确保你只添加一次子视图。在随后调整父视图的大小时,您可能需要在 viewDidLayoutSubviews 中执行其他操作,以便对子视图进行适当的调整。

但是正确做这种事情的方法是添加子视图(可能在viewDidLoad中)并给它约束 以便它的框架从此以后相对于它的超级视图保持正确 不管 何时以及如何调整超级视图的大小。在你的问题中,你似乎拒绝了那种无法控制的方法,但无论如何,这是正确的做法,你应该放弃对它的抵制。