在UIStackView中隐藏已排列的子视图而不是剪辑内容

问题描述 投票:3回答:1

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

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

Third label in stack view is clipped

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

我的问题是,什么是正确的时间来检测标签的高度没有完全显示并隐藏它。

标签高度接近但不完全等于UIFontlineHeight所以有一些舍入涉及使这有点困难。

最大的问题是,在UIStackViewlayoutSubviews中布局传递之后,可以检测到排列的子视图的高度,但是您无法隐藏此处的排列视图,因为它会导致另一个布局传递和递归。

那我错过了什么? :-)

这是一个test project - 在模拟器中为iPhone Xs构建,你会在上面的截图中看到相同的结果。

汤姆欧文在下面的要点指出了我正确的方向。诀窍是在布局布局后枚举子视图,如果不满足高度要求则删除它们。

updated project展示了如何在DebugStackViewlayoutSubviews中做到这一点。是的,UIStackView是一个有价值的对手。

ios autolayout uistackview
1个回答
0
投票

你能对viewDidLoad采取行动吗?

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

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

当然,问题可能比我理解的要多,但这样可以让你在layoutSubview传递发生之前计算出来。

© www.soinside.com 2019 - 2024. All rights reserved.