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:如何显示/隐藏包含边距的视图?的主要内容,如果未能解决你的问题,请参考以下文章

自动布局:如何隐藏包含子视图的 UIView?

IOS/Autolayout:如何修复大文本视图的宽度?

IOS / Autolayout:如何修复大文本视图的宽度?

iOS进阶 - AutoLayout 是如何自动布局的,性能如何?

iOS进阶 - AutoLayout 是如何自动布局的,性能如何?

如何在 UINavigationBar 下方绘制主视图,以便当栏显示/隐藏时,视图不受影响?