Выравнивание по центру stackView при сохранении фиксированного расстояния - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть UITableViewCell, который должен показывать две метки, из которых одна может иметь высоту 1 или 2 строки.Предполагается, что метки имеют фиксированный интервал между собой.Вместе они всегда должны располагаться вертикально в центре ячейки.

Я думал, что UIStackView будет хорошим решением для этого, но ни один из параметров распределения не допускает фиксированного расстояния между элементами.Какое хорошее решение для описанного сценария?Я приложил иллюстрацию (серый = ячейка, линия = вертикальный центр ячейки), чтобы сделать это проще enter image description here

1 Ответ

0 голосов
/ 08 февраля 2019

Ваши изображения на самом деле не показывают этикетки по центру по вертикали.

С одной строкой в ​​каждой метке, они оба имеют высоту 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), поэтому вам нужно изменить его, если вы измените свой интервал.

Вот результат (красная линия - вертикальная средняя линия):

enter image description here

...