Stackview中的iOS 10方形UIIMageView在隐藏时会破坏自动布局

Posted

技术标签:

【中文标题】Stackview中的iOS 10方形UIIMageView在隐藏时会破坏自动布局【英文标题】:iOS 10 square UIIMageView in Stackview breaks Autolayout when hidden 【发布时间】:2017-05-17 13:44:29 【问题描述】:

我有一个 UITableViewCell,我认为这是一个非常简单的布局。主要内容是一个 UIStackView(水平)。在其中我有 UIImageView 和两个 UILabel。在 UIImageView 我有 2 个约束。一个是 1:1 的纵横比使其成为正方形,另一个是高度限制为 55 点。 UIStackView 被固定到单元格 contentView 的所有侧面。

现在,当我没有要在 UIImageView 中显示的 UIImage 时,我只需调用 imageView.isHidden = true 并且 UIStackView 会隐藏图像。同时,在控制台上,我看到 AutoLayout 中断。它告诉我它不能满足55的高度和0的宽度。

这是有道理的,因为由于纵横比,UIImageView 也希望具有 55 的宽度。但是,在设备本身上,我没有看到任何奇怪的故障。它的行为完全符合我的预期。

所以问题是

这是一件坏事吗?如何用最少的代码解决这个问题?

顺便说一句,我正在使用动态高度自调整 UITableView 并让 AutoLayout 确定我的单元格的高度。 UIImageView 可能是单元格的唯一内容。

【问题讨论】:

【参考方案1】:

这不是错误 StackView 将约束添加到它的排列子视图。当您在视图上调用隐藏时,在您的情况下是 imageView。 stackView 尝试将高度约束设置为 0,但您添加的高度约束与 stackView 添加的约束冲突。

您可以将高度约束的优先级更改为小于 1000 的值,这将解决冲突问题

【讨论】:

非常感谢!您是否知道在设置子视图的 isHidden 属性时将宽度或高度(我猜它取决于 UIStackView 方向)设置为 0 是否是 UIStackView 特定的“事物”,或者这是 AutoLayout 如何工作的一般事情?跨度> 不,我认为它与 stackView 的方向无关。从 ios 10 及更高版本开始,苹果引入了将高度约束更改为 0 的新概念,如果您尝试在 iOS 9 中运行项目而不更改高度约束优先级,则不会出现约束错误,但它会在 iOS 10 中引发错误跨度>

以上是关于Stackview中的iOS 10方形UIIMageView在隐藏时会破坏自动布局的主要内容,如果未能解决你的问题,请参考以下文章

隐藏stackview中的第一个子视图和其他在iOS 10.2上消失但不是11

iOS:更改 StackView 中 TextField 的高度(在 StackView 内)

带有约束的滚动视图中的iOS Swift stackview

iOS火焰动画效果图文混排框架StackView效果偏好设置底部手势等源码

iOS Stackview Tap Buttons在彼此之上

NIB/XIB 中的 StackView 约束行为是不是不同?