Почему UITableViewCell сокращает contentView? - PullRequest
0 голосов
/ 23 января 2019

Вот то UITableView, которое я хочу сделать:

enter image description here

Чтобы достичь этого, я разделил contentView клетки на три части.

1 - fromView : содержит время начала и тип класса. Высота будет 30% от contentView

2 - infoView : содержит изображение часов, имя класса и имя профессора. Высота будет 40% от contentView.

3 - toView : содержит время окончания и местоположение. Высота будет оставленным пробелом (30%).

Во-первых, прежде чем перейти к деталям, я решил показать только эти контейнеры. Для понимания проблемы я их покрасил (зеленый, красный, синий соответственно).

После добавления их в contentView вот ограничения, которые я дал этим контейнерам:

   fromView.easy.layout(Top(), Left(), Right(), Height(*0.3).like(contentView))

    infoView.easy.layout(Top().to(fromView), Left(), Right(), Height(*0.4).like(contentView))

    toView.easy.layout(Top().to(infoView), Left(), Right(), Bottom())

Кажется, все правильно. После запуска думал, что увижу их, но вот что получилось:

enter image description here

Я думал, что ячейка не знает, какого размера она должна быть, поэтому я решил реализовать следующую функцию:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 150
}

После этого UITableView показывал контейнеры довольно правильно, чем раньше. Но я планирую добавить несколько UILabel и другие views в эти контейнеры (см. Первое изображение). Другими словами, я не знаю, какой размер должна иметь клетка. Это должно быть отчасти динамичным. Во всяком случае, я пытался добавить эти метки в контейнеры, возможно, после этого ячейка будет вычислять высоту. Вот как я это сделал:

func setupViews() {

    fromView.addSubviews(fromTime, classType)

    toView.addSubviews(toTime, room)

    infoView.addSubviews(clockImage, teacherName, subjectName)

    contentView.addSubviews(toView, fromView, infoView)



}

func setupConstraints() {

    fromView.easy.layout(Top(), Left(), Right(), Height(*0.3).like(contentView))

    infoView.easy.layout(Top().to(fromView), Left(), Right(), Height(*0.4).like(contentView))

    toView.easy.layout(Top().to(infoView), Left(), Right(), Bottom())

    fromTime.easy.layout(CenterY(), Left(8))

    fromTime.setContentHuggingPriority(.required, for: .horizontal)

    fromTime.setContentCompressionResistancePriority(.required, for: .horizontal)

    classType.easy.layout(CenterY(), Left(8).to(fromTime))

    clockImage.easy.layout(CenterY(), Left(16), Width(24), Height(24))

    subjectName.easy.layout(CenterY(-8), Left().to(classType, .left), Right())

    teacherName.easy.layout(Top(8).to(subjectName), Left().to(subjectName, .left), Right())


    toTime.easy.layout(CenterY(), Left(8))

    toTime.setContentHuggingPriority(.required, for: .horizontal)

    toTime.setContentCompressionResistancePriority(.required, for: .horizontal)


    room.easy.layout(CenterY(), Left(8).to(toTime))

}

Но в любом случае проблема снова возникла так:

enter image description here

Я думаю, проблема в том, что я задаю высоту для контейнеров в соответствии с высотой contentView, но contentView не знает ее высоту. Но я также не знаю, какую высоту он должен иметь, потому что он должен зависеть от размера этикеток. Итак, как решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Не устанавливайте высоты для контейнеров. Вы должны убедиться, что верх и низ ячейки связаны через ограничения. Я рекомендую просто избавиться от контейнеров, добавить все метки и изображения непосредственно в ячейку и создать подобные ограничения.

enter image description here

Затем установите tableView.rowHeight = UITableView.automaticDimension или верните UITableView.automaticDimension из tableView(_:heightForRowAt:)

0 голосов
/ 23 января 2019

Похоже, что вам нужна динамическая высота, рассчитанная на основе AutoLayout контента.Обновите делегатов, чтобы они возвращали UITableViewAutomaticDimension для heightForRowAt и некоторые хорошие оценки, например, 150 для estimatedHeightForRowAt:

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return 150
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

Затем вы можете просто установить размер содержимого с помощью автопоставки, иТаблица будет вычислять высоту ячеек для вас динамически.

Расчетная высота используется для целей прокрутки - хорошая оценка предоставит вам хороший опыт прокрутки (динамическая высота рассчитывается только при отображении ячейки, таким образом,для еще не показанных ячеек tableView будет использовать оценку при прокрутке).

0 голосов
/ 23 января 2019

Попробуйте, задав ограничение высоты для вашего основного вида внутри вашей ячейки.

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