我有一个带有三个标签的UIStackView
,其标签的高度是使用动态类型确定的,而文本的长度却可以变化很大。堆栈视图的容器具有固定的宽度和高度,具体取决于设备屏幕的尺寸(例如,在iPhone SE上较小。)我想将堆栈视图置于容器的中心(具有一些外部边距)。
问题在于,根据字体大小和容器高度,堆栈视图中的某些标签将被剪切。这是带有第三个标签的示例:
我已经为堆栈视图和标签尝试了布局约束优先级,但这似乎不是正确的方法。相反,设置标签的可见性会更好:保持元素之间的正确间距。
然后我的问题是,什么时候检测标签的高度没有完全显示 并将其隐藏。
标签的高度接近UIFont
的{{1}},但不完全等于lineHeight
,因此要进行一些舍入操作会使其变得有些困难。
最大的问题是,在UIStackView
的{{1}}中通过布局后,可以检测到排列好的子视图的高度,但是您不能在那一刻隐藏排列的视图,因为导致另一个布局传递和递归。
那我想念什么? :-)
这是test project-在模拟器中为iPhone Xs构建的,您将在上面的屏幕截图中看到相同的结果。
解决方案
汤姆·欧文(Tom Irving)的要旨在下面指出了我正确的方向。诀窍是在布局通过后枚举子视图,如果不满足高度要求,则将其删除。
updated project在layoutSubviews
的{{1}}中显示了如何执行此操作。是的,DebugStackView
是一个有价值的对手。
答案 0 :(得分:0)
您可以对viewDidLoad
采取行动吗?
我的直觉是将堆栈视图中所有可见子视图的高度加起来,然后在出现问题时隐藏最后一个。
在您提供的示例中,我建议为每个可见标签获取一个CGSize
和一个[self.firstLabel textRectForBounds:self.view.bounds limitedToNumberOfLines:0]
,并确保将商品之间的边距计算在内,并确定总高度是否更大比您分配给堆栈视图的恒定高度。如果是这样,请隐藏超出堆栈视图高度的元素。
当然,问题可能比我理解的更多,但这可以让您在layoutSubview
传递通过之前进行计算。