自动布局如何在具有 3 个等宽视图的视图中隐藏 1 个视图
Posted
技术标签:
【中文标题】自动布局如何在具有 3 个等宽视图的视图中隐藏 1 个视图【英文标题】:Auto layout how to hide 1 view in a view with 3 equal width views 【发布时间】:2016-07-14 02:29:19 【问题描述】:目前我在 1 个视图中有 3 个视图(固定到超级视图的前沿和后沿)。
这 3 个视图目前如下所示:
但是,在某些情况下,我希望隐藏靛蓝视图,但仍保持最后 2 个相同的宽度,如下所示:
如何通过自动布局实现这一点?或者如何使用 IBOutlets 进行约束来实现这一点?
【问题讨论】:
您是否尝试过创建 IBOutlet 然后使用 .hidden 属性? @MatthewBradshaw IBOutlet 将连接到什么? 通过将控件拖入助手编辑器,将您想要以编程方式操作的视图连接到 IBOutlet。然后操纵那个出口。 .hidden 属性是一个布尔值。查看本教程developer.apple.com/library/ios/referencelibrary/GettingStarted/… 您是否尝试过使用UIStackView
?
@tktsubota 我也支持 iOS 8,所以不幸的是,这不是一个选择。 Stackview 会让它变得更容易。
【参考方案1】:
如果部署目标是iOS9或更高版本,建议使用UIStackView
作为封闭视图。在UIStackView
中排列的任何视图上将isHidden
设置为true
不仅会使视图隐藏,而且堆栈视图也会重新组织所有非隐藏视图以填充由隐藏的观点。可以通过在 UIStackView
上调整 distribution
来调整此行为。
Tj3n 的答案有效,但它有一个缺点,您必须在代码中使用幻数并在代码和 IB 中设置约束属性。
恕我直言,更好的解决方案是在 IB 中设置具有不同优先级的所有约束,并在代码中激活/停用它们。试试这个:
-
像以前一样设置前导/尾随约束。
为所有三个优先级为
high
的视图设置相等的宽度约束。
为所有三个优先级为required
的视图设置0 宽度约束,但在IB 中将它们停用。并在代码中将它们连接到IBOutlet
s,就像连接视图一样。
激活任何 0 宽度约束以折叠所需的视图,然后停用它们以展开。
注意,只要设置 1 和 2,就可以实现等宽视图布局。使用 3 和 4,您可以有选择地折叠/展开任何视图。
【讨论】:
如何激活约束?NSLayoutConstraint
具有布尔属性 isActive
知道了。当我在 IB 中添加 0 宽度约束时,它们会自动停用吗?
不,它们默认被激活。检查器中有一个名为 installed
的复选框。它只是表示已激活,取消选中它以使约束停用。该名称具有误导性。
嗨@Alper,如果您支持iOS 9 或更高版本,UIStackView
更易于使用和推荐。【参考方案2】:
这很简单,你可以为3个视图创建等宽约束A,设置它的优先级为998,然后为它们创建另一个单宽度约束B1、B2、B3,设置优先级为997,如果你想隐藏任何3个视图中,将B约束的常量设置为0,将其优先级提高到999,然后调用self.view.layoutIfNeeded
,视图将隐藏,其他视图将缩放
测试约束是灰色视图的宽度约束:
【讨论】:
单宽约束是什么意思? 意思是你点击它,按下下面的 Pin 按钮,然后检查width
,然后将其优先级设置为 997,你必须为其设置属性以便稍后在代码中更改优先级【参考方案3】:
如果它总是可以隐藏的靛蓝视图,你应该通过添加这个约束来解决你的问题:
Indigo 视图:导致 superview + 尾随到 PurpleView + 宽度约束
Purple view : 和 grayView 一样宽
灰色视图:导致紫色视图+尾随超级视图
应该是这样的:
如果你改变你的 indigoView 的 width 属性,一切都应该正确。
希望对你有所帮助。
【讨论】:
但是 indigo 视图没有指定宽度限制,那么我该如何以编程方式隐藏它呢? 您只需将约束链接为 IBOutlet,并将 yourConstraint.constant 设置为 0,并将 indigoView.frame.size.width 设置为 0。通过这种方式,通过设置您的 indigoView 宽度,您将拥有使用整个 restan 宽度的其他视图。以上是关于自动布局如何在具有 3 个等宽视图的视图中隐藏 1 个视图的主要内容,如果未能解决你的问题,请参考以下文章