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