居中对齐stackView,同时保持固定间距

时间:2019-02-07 16:14:23

标签: swift alignment uilabel uistackview

我有一个UITableViewCell,应该显示两个标签,其中一个标签的高度可以为1或2行。标签之间应具有固定的间距。始终希望它们一起在单元格内垂直居中。

我认为UIStackView将是一个很好的解决方案,但是没有一个分发选项允许项目之间的固定间隔。对所描述的方案有什么好的解决方案?为了方便起见,我附上了一个插图(灰色=单元格,线=单元格的垂直中心)enter image description here

1 个答案:

答案 0 :(得分:0)

您所显示的图像实际上并未显示垂直居中的标签。

每个标签中只有一行,它们的高度均为20.5点(假定默认字体/大小),间隙为12点。精细。足够容易地在Y轴上居中。

在顶部标签中有两条行,它变成(20.5点+ 0间隙+ 20.5点),然后是12点间隙,然后是20.5点单行标签。因此,这不是文本行的均匀分布,这就是为什么堆栈视图的垂直居中不会将中心线放置在文本第二行的中心线的原因。

如果您检查图像(我假设您是手工布置的),则在视图顶部和顶部标签顶部之间有201个像素,但只有{{1} }位于底部标签底部和视图底部之间的像素。

如果这确实是您想要的布局,则可以执行以下操作:

  • 设置固定的行高
  • 让您的堆栈查看centerYAxis约束
  • 保留对该约束的引用

然后,覆盖198

willDisplay cell

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { if let c = cell as? ExampleCell { cell.layoutIfNeeded() let topHeight = c.topLabel.frame.height let botHeight = c.bottomLabel.frame.height if topHeight > botHeight { c.stackViewCenterYConstraint.constant = 6.0 } else if botHeight > topHeight { c.stackViewCenterYConstraint.constant = -6.0 } else { c.stackViewCenterYConstraint.constant = 0.0 } } } 的值是堆栈视图间距的1/2(12 * 0.5 == 6),因此,如果更改间距,则需要进行更改。

这是结果(红线是垂直中线):

enter image description here