Вот то UITableView
, которое я хочу сделать:
Чтобы достичь этого, я разделил 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())
Кажется, все правильно. После запуска думал, что увижу их, но вот что получилось:
Я думал, что ячейка не знает, какого размера она должна быть, поэтому я решил реализовать следующую функцию:
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))
}
Но в любом случае проблема снова возникла так:
Я думаю, проблема в том, что я задаю высоту для контейнеров в соответствии с высотой contentView
, но contentView
не знает ее высоту. Но я также не знаю, какую высоту он должен иметь, потому что он должен зависеть от размера этикеток. Итак, как решить эту проблему?