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