iOS Autolayout:如何显示/隐藏包含边距的视图?
Posted
技术标签:
【中文标题】iOS Autolayout:如何显示/隐藏包含边距的视图?【英文标题】:iOS Autolayout: How to show / hide a view including its margins? 【发布时间】:2019-08-26 09:23:39 【问题描述】:假设如下,简单的布局:
三个视图垂直堆叠在一起 在视图之间使用简单的垂直间距是否可以仅使用约束/自动布局来隐藏包括其边距在内的红色视图?
设置redView.isHidden = true
将隐藏红色视图但不会改变蓝色视图的位置。蓝色视图将保持在与红色视图可见时相同的位置。
使用redView.removeFromSuperview()
完全删除红色视图将显示所需的结果。由于它对绿色视图的可选间距限制,蓝色视图将移动到红色视图所在的位置。然而,重新显示红色视图会非常困难,因为它的所有约束都必须从头开始设置。
在 android 中,将可见性设置为 View.INVISIBLE
只是隐藏了一个视图(如这里描述的第一种情况),而 View.GONE
呈现剩余的布局,就好像视图根本不存在一样。
这可以在 iOS 上仅使用约束/自动布局来完成吗?
当然,我可以通过手动操作约束并在代码中设置新约束来实现相同的购买。但问题是,有没有像 Android 那样更方便的解决方案?
【问题讨论】:
我不知道这是不是个好主意。我们可以采用标签高度约束插座并以编程方式将其设置为 0 或 40? 我经常通过以编程方式将受影响约束的优先级设置为 750(高)或 250(低)来实现此目的。这样你就可以在你想要“控制”的约束之间切换。 @Andrei Herford,使用垂直堆栈视图。下面的答案是正确的。 【参考方案1】:VerticalStackView 似乎符合您的要求。您可以在堆栈视图中包含所有视图并直接在其上设置间距。 然后,如果其中一个视图被隐藏,堆栈视图会自动调整所有约束。
看看图片:
【讨论】:
【参考方案2】:如果可能,请将您的视图包装在垂直的UIStackView
中。然后,您可以单独的视图和其他视图将按预期重新排列。您也不需要在项目之间添加约束,因为 stackview 处理视图之间的间距。
【讨论】:
【参考方案3】:最简单的方法是将视图嵌入到 StackView 中,当其中一个被隐藏时,下面的一个将向上移动到它的位置。 请按以下步骤操作:
-
在storyboard/xib中添加你需要的所有视图
编辑器 - 嵌入 stackView
在stackView中设置间距
设置stackView 约束
为您希望在特定情况下隐藏的视图创建出口
将 views hidden 属性设置为 true
关于约束,你可以为 StackView 设置它们,对于垂直的,只需在 StackView 中设置相等的间距和空间属性。
结果:
【讨论】:
以上是关于iOS Autolayout:如何显示/隐藏包含边距的视图?的主要内容,如果未能解决你的问题,请参考以下文章
IOS / Autolayout:如何修复大文本视图的宽度?
iOS进阶 - AutoLayout 是如何自动布局的,性能如何?