swift4 - 当视图大小不同时如何以编程方式设置约束?
问题描述
使用 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
如何正确修改约束以实现此目的?
解决方案
正如我在评论中提到的,您应该使用UIStackView
顶部/底部视图的可见性控制。
您将需要UIStackView
具有以下属性的 a:
- 轴:垂直
- 对齐方式:填充
- 分布:填充
- 间距:根据您的需要
堆栈视图将分别包含顶视图、容器视图和底视图作为其子视图。
您需要将此堆栈视图的所有边(前导、尾随、顶部和底部)固定到其父视图(视图控制器的视图)。由于您的顶视图和底视图需要一些高度限制,您可以根据需要提供它们。
因此,基本上您的堆栈视图现在能够在您隐藏其中任何一个时调整其子视图的大小。你只需要执行:
theSubViewNeedsTobeHidden.isHidden = true
我为你做了一个工作演示,可以在这里找到。
推荐阅读
- swift - 在 Swift 中,除了在一个地方之外,如何拥有全局色调?
- weka - 在哪里可以找到使用 weka 的 Java 中 KNN 的实际示例
- javascript - Mongoose 在一个数据库调用中保存条件?
- html - 如何删除导航栏下拉菜单悬停周围的灰色框
- node.js - Heroku 卡在为 NodeJs 应用程序构建源代码
- sql - 带有 SQL 查询的种子模型表
- java - 如何创建一个java程序让用户使用密码登录并存储数据
- wpf - 将 DataTemplate 项目事件绑定到视图模型中的命令
- java - 如何解析限定名称表达式中的字段
- haskell - 我们可以在 Haskell 中编写一个函数来测量包含 n 个字符的字符串占用的字节数吗?