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