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

时间:2017-12-17 19:23:42

标签: ios swift subview childviewcontroller

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

我也真的尝试过使用其他解决方案。我无法完成这项工作,所以非常感谢一些帮助。

1 个答案:

答案 0 :(得分:1)

无法以您的代码提出的硬编码方式执行操作。您正在根据self.bounds设置子视图的框架。但是在viewDidLoad中,我们还不知道self.bounds的最终值。现在还为时过早。

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

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