我知道无数类似的问题,要么都导致使用灵活的高度/宽度或设置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中初始化视图。有没有办法解决这个问题,以便按预期工作?或者在加载超级视图后重新加载子视图约束?
我也真的尝试过使用其他解决方案。我无法完成这项工作,所以非常感谢一些帮助。
答案 0 :(得分:1)
无法以您的代码提出的硬编码方式执行操作。您正在根据self.bounds
设置子视图的框架。但是在viewDidLoad
中,我们还不知道self.bounds
的最终值。现在还为时过早。
依赖于了解布局值的适当位置是在布局发生之后,即在viewDidLayoutSubviews
中。请注意,这可以在应用程序的生命周期中多次调用;您不希望每次发生时再次添加子视图,因此请使用Bool标志以确保仅添加子视图一次。在后续调整超级视图时,您可能需要在viewDidLayoutSubviews
中执行其他操作,以便对子视图进行适当调整。
但正确的方法是做这种事情是添加子视图(可能在viewDidLoad
中)并给它约束以便它的框架将此后,相对于其超级视图,无论何时以及如何调整超级视图的大小,都保持正确。在你的问题中,你似乎无法拒绝这种方法,但它仍然是正确的做法,你应该放弃对它的抵制。