Swift - 容器视图未根据方向更改调整大小

Swift - Container view not resizing on orientation change

我看到了几个与此问题相关的问题,但没有适用于我的情况的答案。

我在容器 (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)
    }

从 viewDidLoad 调用函数 addSampleVC。根据其他答案,我尝试在 viewWillTransition 中获取更新的容器边界,然后调用 setNeedsLayout 和 setNeedsUpdate,但我一定遗漏了一些东西,因为似乎没有任何效果。感谢您的任何想法。

我已经处理过一次视图容器,所以我会尽力帮助您。

您可以选择使用自动布局或 "manual" 布局(又名自动调整大小约束)。在您的代码中,在 addSampleConstraints 中,第 3 行中的左锚语句将被忽略,因为未明确设置自动布局。

  1. 手动布局:
    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. 自动布局(第一个功能同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
    }