超级视图完成加载时调整子视图的大小
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
中)并给它约束 以便它的框架从此以后相对于它的超级视图保持正确 不管 何时以及如何调整超级视图的大小。在你的问题中,你似乎拒绝了那种无法控制的方法,但无论如何,这是正确的做法,你应该放弃对它的抵制。
我知道有无数类似的问题都导致使用灵活 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
中)并给它约束 以便它的框架从此以后相对于它的超级视图保持正确 不管 何时以及如何调整超级视图的大小。在你的问题中,你似乎拒绝了那种无法控制的方法,但无论如何,这是正确的做法,你应该放弃对它的抵制。