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

问题描述 投票:-1回答:1

我知道无数类似的问题,要么都导致使用灵活的高度/宽度或设置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中初始化视图。有没有办法解决这个问题,以便按预期工作?或者在加载superview后重新加载子视图约束?

我也真的尝试过使用其他解决方案。我不能做这项工作所以非常感谢一些帮助。

ios swift subview childviewcontroller
1个回答
1
投票

没有办法以您的代码提出的硬编码方式执行操作。您正在基于self.bounds设置子视图的框架。但在viewDidLoad,我们还不知道self.bounds的最终价值。太早了。

做出取决于知道布局值的事情的适当位置是在布局发生之后,即在viewDidLayoutSubviews。请注意,这可以在应用程序的生命周期中多次调用;您不希望每次发生时再次添加子视图,因此请使用Bool标志以确保仅添加子视图一次。在后续调整超级视图时,您可能需要在viewDidLayoutSubviews中执行其他操作,以便对子视图进行适当调整。

但是这样做的正确方法是添加子视图(可能在viewDidLoad中)并赋予它约束,以便它的帧相对于其超视图将保持正确,无论何时以及如何调整超视图的大小。在你的问题中,你似乎无法拒绝这种方法,但它仍然是正确的做法,你应该放弃对它的抵制。

© www.soinside.com 2019 - 2024. All rights reserved.