Ваши изображения на самом деле не показывают этикетки по центру по вертикали.
С одной строкой в каждой метке, они оба имеют высоту 20,5 пункта (при условии, что размер / размер шрифта по умолчанию), с пропуском в 12 пунктов.Хорошо.Достаточно легко центрировать по оси Y.
С двумя линиями в верхней метке, он становится (20,5 пункта + 0-разрыв + 20,5 пункта), а затем 12 пунктовпробел, а затем 20,5-пт однострочный ярлык.Таким образом, это не равномерное распределение строк текста, поэтому вертикальное центрирование стекового представления не помещает центральную линию через центральную линию второй строки текста.
Если вы изучитеваше изображение (которое я предполагаю, что вы выложили вручную), у вас есть 201
пикселей между верхней частью вида и верхней частью верхней метки, но только 198
пикселей между нижней частью нижней метки инижняя часть вида.
Если вы действительно хотите, чтобы он выложился, вы можете сделать это:
- установить фиксированную высоту строки
- датьпросмотр стека ограничение centerYAxis
- сохранить ссылку на это ограничение
Затем переопределить 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
}
}
}
Значение 6.0
равно 1/ 2 от расстояния между представлениями стека (12 * 0,5 == 6), поэтому вам нужно изменить его, если вы измените свой интервал.
Вот результат (красная линия - вертикальная средняя линия):