当视图开始被隐藏时,约束会发生啥?

Posted

技术标签:

【中文标题】当视图开始被隐藏时,约束会发生啥?【英文标题】:What happens with constraints when a view is begin to be hidden?当视图开始被隐藏时,约束会发生什么? 【发布时间】:2018-05-10 14:31:20 【问题描述】:

问题与this 非常相似,但我对UIView 更改isHidden 值时发生的情况很感兴趣。

例如: | | | -[ViewA]-[ViewB]-[ViewC]- | | |

草稿:

[X] -> 观看次数

|- -> 约束

在以下情况下会发生什么:ViewB.isHidden = true 如何在代码中更正处理显示/隐藏子视图(没有UIStackView)?我应该手动将约束设置为活动/非活动吗?

【问题讨论】:

什么也没发生。如果你闭上眼睛,你的 Mac 还在吗?一样。 (我希望在此期间没有人偷它,因为那样我就会被证明是错的......):P 【参考方案1】:

通常,隐藏视图(通过设置isHidden)对布局没有影响。隐藏视图参与布局。任何连接到视图的约束仍然被强制执行。现在隐藏的视图所占据的区域仍然保留给它。

这很有用,因为它允许您使用隐藏视图作为“分隔符”来创建您无法通过其他方式创建的布局(在 Interface Builder 中)。 (代码中可以使用UILayoutGuides代替隐藏视图,但是IB不支持创建布局指南。)

UIStackView 与其他视图不同。 UIStackView 观察其每个排列的子视图的 isHidden 属性。当排列的子视图的isHidden 更改时,UIStackView 会更新约束以创建或删除该子视图使用的区域。

没有其他视图能像UIStackView 那样做,所以没有其他视图会在其子视图隐藏或可见时调整其布局。

【讨论】:

所以,如果我理解正确,如果我想在代码中隐藏子视图,如果我想重新布局视图,我需要停用每个连接的约束? 如果要隐藏子视图,请将其isHidden 属性设置为true。如果您还想重新排列剩余的视图以填充先前被现在隐藏的子视图占用的空间,那么您需要相应地更新您的约束。它通常比仅仅停用连接到现在隐藏视图的约束更复杂。 如果其他视图根据您要停用的宽度约束正确连接,它们将相应调整大小 我同意。我只想确保任何隐藏/显示视图都需要手动非活动/活动约束。忘记重新排列上下文。 :) 我想了解UIStackView 和经典subviews 之间的区别 谢谢@robmayoff,好主意,虽然我刚刚搜索并找到了***.com/questions/34494061/…,所以我想我现在不会再创建另一个问题了

以上是关于当视图开始被隐藏时,约束会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

ios使用约束隐藏视图

iOS 以编程方式生成的视图具有隐藏的约束,导致与自动布局发生冲突

UIProgressView 约束问题

如何在图像放大时隐藏背景

Swift 中的 UITableView 无法识别 UINavigationBar,填充已关闭,部分 tableview 被隐藏

NSStackView,当其中一个子视图被隐藏时填充视图