Autolayout UITableView расширяет родительское представление, но не превышает безопасную область - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть раскадровка, которая имеет простую иерархию представлений:

- View (has top/bottom constraints relative to safeArea >= 30, centerY)
   - Label (has height/top(SuperView)/bottom(TextField) constraints)
   - TextField (has height/top(Label)/bottom(TableView) constraints)
   - TableView (has height >= 0, top(TextField)/bottom(Superview) constraints)

Внутри UITableViewDelegate (cellForRowAt):

tableView.setNeedsLayout()
tableView.layoutIfNeeded()

Поведение, которое я хочу достичь, - иметь TableView.и родительский вид растет по мере добавления к нему новых записей.Однако родительское представление не должно превышать своих верхних / нижних ограничений относительно безопасной области.

Все элементы имеют ограничения по высоте и явно заданные интервалы, кроме табличного представления (которое имеет высоту> = 0).Кроме того, приоритет просмотра содержимого представления родительского элемента равен 250, а сопротивление сжатию табличного представления равно 750. Я думал, что фиксация ограничений высоты и расстояния между элементами позволит табличному виду расти до некоторой точки, поскольку сопротивление сжатию содержимого выше для верхнего уровня./ Нижняя безопасная область, чем для TableView.

Однако XCode заставляет меня установить высоту или ограничение позиции Y для родительского представления.Я не могу этого сделать, потому что тогда представление не может расти автоматически.

Я бы предпочел придерживаться AutoLayout и задаться вопросом, есть ли у кого-нибудь идея или ресурс о том, как это сделать.

1 Ответ

1 голос
/ 03 апреля 2019

Табличные представления не устанавливают автоматически свою высоту в зависимости от количества строк.

Вы можете использовать этот пользовательский класс табличного представления (из https://stackoverflow.com/a/48623673/6257435):

final class ContentSizedTableView: UITableView {
    override var contentSize:CGSize {
        didSet {
            invalidateIntrinsicContentSize()
        }
    }

    override var intrinsicContentSize: CGSize {
        layoutIfNeeded()
        return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
    }
}

Это будет «автоматически»-size »табличного представления всякий раз, когда изменяется размер содержимого. Чтобы использовать его, добавьте табличное представление и установите для его класса значение ContentSizedTableView.

  • Ограничьте верхний, ведущий и конечный значения по желанию.
  • Ограничьте нижнюю часть до >= 0 до нижней части суперпредставления (или >= 8, если вы хотите, чтобы он останавливался на 8 пунктов снизу, или любое другое значение для макета).
  • Дайте ему ограничение по высоте - на самом деле неважно, что, но с использованием значения, такого как 100, мы увидим его при работе с макетом.
  • Затем отредактируем эту высотуограничение и установите флажок Placeholder - Удалить во время сборки .

Ограничение высоты представления таблицы будет удалено при запуске приложения, а ContentSizedTableView будет автоматически расти, пока не достигнет нижнейstraint.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...