UITableView внутри UITableViewCell проблемы с высотой - PullRequest
0 голосов
/ 14 мая 2019

View Heirarchy

В общем, я хочу вставить UITableView внутрь UITableViewCell.

Я использовал UIStackView, чтобы использовать его AutoLayout power!

В любом случае, каждый ряд "Inner UITableView" будет состоять из UIImageView фиксированного размера и UILabel из lines = 0 (т.е. не фиксирован)

UIStackView (по горизонтали) -> UIImageView + UILabel

Требования:

  • Размер каждой строки / ячейки для InnerTableViewдолжен быть динамическим из-за случайного текста, предоставляемого с сервера.Таким образом, высота всего Внутреннего UITableView до automaticDimension
  • Текст для UILabel над Внутренним UITableView также является динамическим.(таким образом, имеет смысл использовать UIStackView в первую очередь)

Примечание: Main UITableView состоит из нескольких ячеек разных типов (в основном это BotChatBot)

Также: estimatedHeight может составлять около 40 точек.

Проблема:

Динамический размер InnerTableView приводит кметод cellForRowAt не вызывается один раз, что не позволяет UIStackView увеличить его длину из-за отсутствия изменений в contentSize.

Чтобы решить вышеуказанную проблему, я попытался:

  • Установить начальное ограничение высоты для UITableVIew равным 10 (некоторое случайное число), estimatedRowHight для InnerTableView равным 50, таким образомустановка высоты UITableView как tableViewInsideCellHeightConstraint?.constant = tableViewInsideCell.contentSize.height, что каким-то образом дает мне место, но это все еще не надежно, когда высота строки превышает расчетную высоту 40

The problem

PS layoutIfNeeded() были запущены для TableView, StackView и ParentCell

У меня также есть другой способ решения вышеуказанной проблемы:

  1. Используя приблизительную высоту, умножьте константу (оценка высоты) на количество отображаемых строк, т.е. размер списка
  2. Измените heightConstraint для Inner UITableView на вычисленную,
  3. Для каждой итерации рассчитайте общую «ТРЕБУЕМУЮ» высоту (используя +=visibleCells[i].frame.height) UITableView (поскольку каждая итерация будет предоставлять размер ячейки (размер содержимого)
  4. Обновлять ограничение высотыInner UITableView
    if heightForTableView == nil {
        if indexPath.row == listDict!.count - 1 {
          var heightOfTableView: CGFloat = 0.0
          let cells = tableView.visibleCells
          for visibleCells in cells {
            heightOfTableView += visibleCells.frame.height
          }
          let newHeight = heightOfTableView + cell.frame.height
          reloadMe(newHeight)
        }
      }

Вышеуказанные фиx приводит к видимому рывку в пользовательском интерфейсе: [

Вопрос:

Есть ли конкретное решение вышеуказанной проблемы?Я пытался искать его снова и снова .. не могу найти какой-либо сильной фиксации!

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Хорошо, значит вы создаете приложение для чата.Это меняет несколько моих предложений.

Итак, чтобы ответить на ваш вопрос в его нынешнем виде, вы можете выполнить что-то вроде этого: Замена устаревшего sizeWithFont: в iOS 7? вычисление размератекст с sizeWithAttributes:.Суммируя все высоты надписей (работая, если изображение будет больше) и используя это, чтобы попытаться вычислить фиксированную высоту для представления таблицы, тогда он отобразит список полностью.Это на самом деле не идеальный случай для просмотра таблицы.

Лично я бы посмотрел, как вялый справляется с этим.Вместо того, чтобы располагать параметры внутри текстового всплывающего окна, вы можете сделать так, чтобы каждый параметр отображался в виде нового всплывающего окна или отдельной ячейки после сообщения или иметь несколько кнопок в одной ячейке.

Вот примерstandbot (с их сайта), показывающий ячейку с набором кнопок, возможно, в виде стека или в виде прокрутки.Это может быть гораздо более простой способ достичь этого, чем иметь табличное представление внутри табличного представления enter image description here

0 голосов
/ 14 мая 2019

Когда вы вызываете API для данных в subTableView , вы можете попробовать, как показано ниже:

self.tvCell?.table.reloadData() //tv cell is my Parent TableViewCell
self.table.beginUpdates() //Parent TableView
self.table.endUpdates() // Parent TableView

Это работает нормально для меня, я надеюсь, что это поможет вам.

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