在 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
将UILabel
s 限制为1 行,并设置preferredMaxLayoutWidth
调整视图上的contentCompressionResistance
和contentHuggingPriority
为rowHeight
使用静态值而不是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 布局问题的主要内容,如果未能解决你的问题,请参考以下文章
字体更改时自动uiLabel和uiTableViewCell调整大小的iphone代码?
首次出现时无法在 UITableViewCell 中更改 UILabel 的框架(使用自动布局)
如何在自定义 UITableViewCell 中更改 UIButton 标题的权重属性?