我知道有无数类似的问题,要么全部导致使用灵活的高度/宽度,要么将 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
以便对子视图进行适当的调整。
But the correct做这种事情的方法是添加子视图(可能在viewDidLoad
)并给它限制条件这样它的框架从此将相对于它的超级视图保持正确不管何时以及如何调整超级视图的大小。在你的问题中,你似乎立即拒绝了这种方法,但无论如何,这是正确的做法,你应该放弃对它的抵制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)