隐藏stackView时打破约束

Posted

技术标签:

【中文标题】隐藏stackView时打破约束【英文标题】:Breaking constraints when the stackView is hidden 【发布时间】:2020-03-25 09:57:57 【问题描述】:

我正在使用 collectionView 作为聊天框。有一个代码可以检测是否有附件并通过

更改 collectionViewCell 的高度
(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath

cellForItemAt中,我显示或隐藏stackView,取决于它是否是文件。

正如我从 print() 中看到的,这个方法首先执行,然后是 sizeForItemAt。为什么当我在cellForItemAt 中设置stackView.hidden = true 并且是短信(然后在sizeForItemAt 中我为短信设置高度)时,会打破隐藏stackView 的约束?

当 stackView 被隐藏时,如何打破约束?基本上没有逻辑……

【问题讨论】:

【参考方案1】:

设置元素.isHidden = true 确实不会删除与该元素相关的任何约束。

对于任何 UI 对象(不仅仅是堆栈视图),如果您希望在隐藏时移除其“空间”,您有几个选择。

1) 将它和其他对象嵌入到堆栈视图中(是的,您可以将堆栈视图嵌入到另一个堆栈视图中)。隐藏排列的子视图时,堆栈视图会自动删除空间。

2) 为您要隐藏的对象上方添加一个额外的垂直空间约束。为约束赋予不同的优先级,并在您想要显示或隐藏相关对象时更改优先级。下面是一个例子:https://***.com/a/60817954/6257435

【讨论】:

以上是关于隐藏stackView时打破约束的主要内容,如果未能解决你的问题,请参考以下文章

如果设置隐藏,iOS UIStackView 无法同时满足约束

当 trait 集合发生变化时,就会出现约束冲突,就好像 stackview 轴没有改变一样

Swift - 以编程方式刷新约束

StackView 在 Button 被隐藏时为 Button 上浆

StackView 中的按钮约束(以 Swift 编程方式)

自动布局 - StackView 删除现有约束