在UIStackView中隐藏安排好的子视图,而不是剪切内容

时间:2019-02-27 20:19:17

标签: ios autolayout uistackview

我有一个带有三个标签的UIStackView,其标签的高度是使用动态类型确定的,而文本的长度却可以变化很大。堆栈视图的容器具有固定的宽度和高度,具体取决于设备屏幕的尺寸(例如,在iPhone SE上较小。)我想将堆栈视图置于容器的中心(具有一些外部边距)。

问题在于,根据字体大小和容器高度,堆栈视图中的某些标签将被剪切。这是带有第三个标签的示例:

Third label in stack view is clipped

我已经为堆栈视图和标签尝试了布局约束优先级,但这似乎不是正确的方法。相反,设置标签的可见性会更好:保持元素之间的正确间距。

然后我的问题是,什么时候检测标签的高度没有完全显示 并将其隐藏。

标签的高度接近UIFont的{​​{1}},但不完全等于lineHeight,因此要进行一些舍入操作会使其变得有些困难。

最大的问题是,在UIStackView的{​​{1}}中通过布局后,可以检测到排列好的子视图的高度,但是您不能在那一刻隐藏排列的视图,因为导致另一个布局传递和递归。

那我想念什么? :-)

这是test project-在模拟器中为iPhone Xs构建的,您将在上面的屏幕截图中看到相同的结果。

解决方案

汤姆·欧文(Tom Irving)的要旨在下面指出了我正确的方向。诀窍是在布局通过后枚举子视图,如果不满足高度要求,则将其删除。

updated projectlayoutSubviews的{​​{1}}中显示了如何执行此操作。是的,DebugStackView是一个有价值的对手。

1 个答案:

答案 0 :(得分:0)

您可以对viewDidLoad采取行动吗?

我的直觉是将堆栈视图中所有可见子视图的高度加起来,然后在出现问题时隐藏最后一个。

在您提供的示例中,我建议为每个可见标签获取一个CGSize和一个[self.firstLabel textRectForBounds:self.view.bounds limitedToNumberOfLines:0],并确保将商品之间的边距计算在内,并确定总高度是否更大比您分配给堆栈视图的恒定高度。如果是这样,请隐藏超出堆栈视图高度的元素。

当然,问题可能比我理解的更多,但这可以让您在layoutSubview传递通过之前进行计算。