我看到了几个与这个问题相关的问题,但没有适用于我的情况的答案。
我在容器(sampleContainer(内有一个视图控制器(sampleVC(,它可以在您开始的任何位置完美加载,但是从横向更改为纵向后不会调整大小,反之亦然。
在我的视图控制器中,我有:
func addSampleVC() {
self.addChild(self.sampleVC)
self.sampleVC.didMove(toParent: self)
self.sampleContainer.addSubview(self.sampleVC.view)
self.addSampleConstraints()
}
func addSampleConstraints() {
sampleContainer.bounds = CGRect(x: 0, y: -20, width: sampleContainer.bounds.width, height: sampleContainer.bounds.height)
sampleVC.view.bounds = CGRect(x: 0, y: 0, width: sampleContainer.bounds.width * 0.94, height: sampleContainer.bounds.height)
sampleVC.view.leftAnchor.constraint(equalTo: sampleContainer.leftAnchor, constant: 20).isActive = true
sampleContainer.clipsToBounds = true
NSLayoutConstraint.constrain(view: sampleVC.view, containerView: sampleContainer)
}
函数 addSampleVC 是从 viewDidLoad 调用的。根据其他答案,我尝试在viewWillTransition中获取更新的容器边界,然后调用setNeedsLayout和setNeedsUpdate,但我一定错过了一些东西,因为似乎没有任何工作。感谢您的任何想法。
我曾经处理过视图容器,所以我会尽力帮助你。
您可以选择使用自动布局或"手动"布局(也称为自动调整大小约束(。在您的代码中,在 addSampleConstraint 中,第 3 行中的左锚语句将被忽略,因为未显式设置自动布局。
- 手动布局:
func addSampleVC() {
self.addChild(self.sampleVC)
self.sampleContainer.addSubview(self.sampleVC.view)
self.addSampleConstraints()
self.sampleVC.didMove(toParent: self)
}
func addSampleConstraints() {
sampleContainer.bounds = CGRect(x: 0, y: -20, width: sampleContainer.bounds.width, height: sampleContainer.bounds.height)
sampleVC.view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
sampleVC.view.frame = CGRect(x: 0, y: 0, width: sampleContainer.bounds.width * 0.94, height: sampleContainer.bounds.height)
sampleContainer.clipsToBounds = true
}
- 自动布局(第一个功能与1相同(:
func addSampleConstraints() {
sampleContainer.translatesAutoResizingMaskIntoConstraints = false // Setting Auto layout
sampleVC.view.translatesAutoResizingMaskIntoConstraints = false // Setting Auto layout
sampleVC.view.topAnchor.constraint(equalTo: sampleContainer.topAnchor).isActive = true
sampleVC.view.bottomAnchor.constraint(equalTo: sampleContainer.bottomAnchor).isActive = true
sampleVC.view.widthAnchor.constraint(equalTo: sampleContainer.widthAnchor, multiplier: 0.94).isActive = true
sampleVC.view.leftAnchor.constraint(equalTo: sampleContainer.leftAnchor, constant: 20).isActive = true
sampleContainer.clipsToBounds = true
}