首页 > 解决方案 > 当视图大小不同时如何以编程方式设置约束?

问题描述

使用 Xcode 10、iOS 11.4+、Swift 4

我有一系列正在浏览的 UIViewController,每个都被放入一个 ContainerView。

在此处输入图像描述

根据推送的 VC,我在主控制器中隐藏/显示顶部或底部视图(以灰色显示),而 ContainerView 始终位于中间(浅蓝色)。

我想做的是设置约束,以便在显示/隐藏顶部或底部视图时 ContainerView 的大小适当。

例如,当显示“主菜单”时,ContainerView 应该填满整个 Main Container 视图(顶部和底部视图将被隐藏)

显示“Item1”时,将显示顶视图并隐藏底视图。因此,ContainerView 应该填充 Main Container 视图的左、右和底部,但 ContainerView Top 应该被限制在 Top 视图的底部。

显示“Item5”时,还将显示顶视图和底视图。因此,ContainerView 应该左右填充 Main Container 视图,并被约束到 Top view 底部,而 Bottom view 顶部(如 Main Container 所示)

我试过使用这样的代码来填充整个主视图:

NSLayoutConstraint.activate([
   ContainerView.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: 0),
   ContainerView.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: 0),
   ContainerView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 0),
   ContainerView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: 0)
])

但是,ContainerView 永远不会改变,Xcode 给了我很多警告,比如:

[LayoutConstraints] 无法同时满足约束。以下列表中的至少一个约束可能是您不想要的。

这是故事板的另一个屏幕截图: 在此处输入图像描述

这是下载我的示例项目的链接: https ://gitlab.com/whoit/containerviews

如何正确修改约束以实现此目的?

标签: swift4nslayoutconstraintxcode10ios11.4

解决方案


正如我在评论中提到的,您应该使用UIStackView顶部/底部视图的可见性控制。

您将需要UIStackView具有以下属性的 a:

  • 轴:垂直
  • 对齐方式:填充
  • 分布:填充
  • 间距:根据您的需要

堆栈视图将分别包含顶视图容器视图底视图作为其子视图。

您需要将此堆栈视图的所有边(前导、尾随、顶部和底部)固定到其父视图(视图控制器的视图)。由于您的顶视图和底视图需要一些高度限制,您可以根据需要提供它们。


因此,基本上您的堆栈视图现在能够在您隐藏其中任何一个时调整其子视图的大小。你只需要执行:

theSubViewNeedsTobeHidden.isHidden = true

我为你做了一个工作演示,可以在这里找到。


推荐阅读