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

Ios 在UIStackView中隐藏排列的子视图,而不是剪切内容,ios,autolayout,uistackview,Ios,Autolayout,Uistackview,我有一个UIStackView,有三个标签,它们的高度是由动态类型和文本决定的,它们的长度可以变化很大。堆栈视图的容器具有固定的宽度和高度,具体取决于设备屏幕大小(例如,iPhone SE上的小屏幕)。我想将堆栈视图放在容器的中心位置(带有一些外部边距) 问题在于,根据字体大小和容器高度,堆栈视图中的一些标签将被剪裁。以下是第三个标签的示例: 我已经尝试了堆栈视图和标签的布局约束优先级,但这似乎不是正确的方法。相反,设置标签的可见性效果更好:元素之间保持正确的间距 我的问题是,什么时候才是检测

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

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

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

我的问题是,什么时候才是检测标签高度未完全显示并隐藏的正确时间

标签高度接近,但并不完全等于
UIFont
lineHeight
,因此需要一些舍入,这使得这有点困难

最大的问题是,在
UIStackView
layoutSubviews
中进行布局传递后,可以检测到排列的子视图的高度,但不能在该点隐藏排列的视图,因为这会导致另一个布局传递和递归

那么我错过了什么呢?:-)

这是在模拟器中为iPhone Xs构建的一个版本,您将在上面的屏幕截图中看到相同的结果

解决方案

下面汤姆·欧文的要点为我指明了正确的方向。诀窍是在布局过程之后枚举子视图,如果不满足高度要求,则将其删除


显示了如何在
DebugStackView
布局子视图中执行此操作。是的,
UIStackView
是一个值得攻击的对手。

你能对
viewDidLoad
采取行动吗

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

在您提供的示例中,我建议为每个可见标签使用
CGSize
[self.firstLabel textRectForBounds:self.view.bounds limitedToNumberOfLines:0]
,确保将项目之间的边距计入账户,以及确定总高度是否大于指定给堆栈视图的恒定高度。如果是,则隐藏超出堆栈视图高度的图元


当然,这个问题可能比我所理解的要复杂得多,但这将允许您在
layoutSubview
通过之前进行计算。

作为提示,您可能已经使用Xcode 12.2 beta创建了这个项目?我已退出测试,需要将部署目标切换到12.1。