在 UITableViewCell 中更改大小类时的 UIStackView 布局问题

Posted

技术标签:

【中文标题】在 UITableViewCell 中更改大小类时的 UIStackView 布局问题【英文标题】:UIStackView layout issues when changing size class in UITableViewCell 【发布时间】:2016-07-21 09:41:24 【问题描述】:

horizontalSizeClass 更改时显示/隐藏arrangedSubviews 时,我在自定义UITableViewCell 中的水平UIStackView 出现布局问题。

我的堆栈视图包含许多子视图,每个子视图取决于单元格配置和大小类别,要么是hidden,要么显示。 UIStackView 旨在处理排列显示的视图,但在旋转时会出现布局问题。

问题:

有时,适当的子视图要么不显示,要么不应该隐藏。 有时,子视图布局不当,未填满堆栈视图的宽度。

尝试:

我尝试了很多方法来解决布局问题:

覆盖 viewWillTransitionToSize:transitionCoordinator 以重新加载表格和/或强制布局 覆盖 viewWillTransitionToTraitCollection:withTransitionCoordinator 以重新加载表格和/或强制布局 覆盖layoutSubviews 以重新配置堆栈视图的arrangedSubviews 配置单元后调用[self setNeedsLayout][self layoutIfNeeded] 在其他地方强制布局 将子视图布局约束优先级更改为 999 将UILabels 限制为1 行,并设置preferredMaxLayoutWidth 调整视图上的contentCompressionResistancecontentHuggingPriorityrowHeight 使用静态值而不是UITableViewAutomaticDimension

似乎无法解决这些问题。

此外,即使单元格在屏幕上滚动关闭/滚动,准备重用并重新配置,问题仍然存在、消失或引入新问题,尽管我正确地重置了 @ 上的单元格987654344@.


示例项目

我创建了一个示例项目来说明布局问题。在这一点上,我不确定UIStackView 是否有问题或者我是否在滥用它。

示例项目:https://github.com/bradgmueller/StackViewTest

示例项目使用自定义 UITableViewCell,并在 xib 中配置视图。使用不同的配置生成行对象,以说明单元格应采用的动态布局:

缩进/不缩进 是否显示分隔符 显示/隐藏“赞”按钮 显示/隐藏“分享”按钮 显示/隐藏信息按钮,其中一个信息按钮用于UIUserInterfaceSizeClassCompact,另一个用于UIUserInterfaceSizeClassRegular

存在一个文本标签,其中包含指示应显示哪些视图的文本,以帮助说明何时不适当地显示/隐藏视图。此外,UIStackView 后面还有一个红色背景视图,用于说明堆栈视图何时无法填充宽度。

截图:

初始布局 - 没有问题

轮换后 - 标有红色“X”的问题


如果有任何见解,我将不胜感激,在此先感谢!

【问题讨论】:

【参考方案1】:

通常堆栈视图非常好,但是当它们变得更复杂并管理更多视图时,它们似乎不太可靠。

我发现避免布局问题的最好方法是做一两件事:

    使用多个堆栈视图。与其将我的所有视图集中到同一个堆栈视图中,拥有多个较小的堆栈视图似乎更可靠,因为每个视图管理的视图更少。 删除/重新插入视图,而不是隐藏它们。虽然堆栈视图应该将“隐藏”视图视为已从层次结构中移除,但当我实际将它们从层次结构中移除时,我得到了更好的布局结果。

例如:

更可靠的布局结果:

if (hideSubview == YES) 
    [subview removeFromSuperview];
 else 
    [stackView insertArrangedSubview:subview atIndex:0];

不那么可靠:

subview.hidden = hideSubview;

【讨论】:

以上是关于在 UITableViewCell 中更改大小类时的 UIStackView 布局问题的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 的异步高度更改

字体更改时自动uiLabel和uiTableViewCell调整大小的iphone代码?

首次出现时无法在 UITableViewCell 中更改 UILabel 的框架(使用自动布局)

如何在自定义 UITableViewCell 中更改 UIButton 标题的权重属性?

当 UIStackView 更改其排列的子视图时,UITableViewCell 不会调整大小

在旋转时更改 UITableViewCell 中的文本对齐方式