Переменное пространство между ячейками в одном разделе - PullRequest
1 голос
/ 16 октября 2019

Ситуация:

У меня есть вид чата. Это похоже на WhatsApp, где разные дни имеют небольшой заголовок, показывающий дату. Я сделал это, создав раздел для каждой отдельной даты и указав дату в заголовке раздела.

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

  • Сообщение 1 от Алисы
  • Сообщения 2 и 3 от Боба
  • Сообщения 4 и 5 от Алисы

тогда в сообщениях 1, 2 и 4 будет отображаться имя отправителя. Это было достаточно просто, просто установив bool для модели сообщений в процессе отображения после извлечения их из API. Ячейка проверяет этот bool и либо устанавливает, либо не устанавливает текст метки имени отправителя.

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

Я попытался переопределить layoutSubviews следующим образом:

override func layoutSubviews() {
    super.layoutSubviews()
    bounds = bounds.inset(by: UIEdgeInsets(top: topInset, left: 0, bottom: 0, right: 0))
}

Где topInset - это CGFloat, который я установил в очереди ячеек следующим образом:

cell.topInset = item.isSenderSameAsPrevious && indexPath.row > 0 ? 10 : 0  

Где item - моя модель сообщения.

Проблема:

Сообщение 1 имеет имя отправителя и поле по умолчанию вверху (заголовок раздела), сообщение 2 от того же отправителя и не имеет имени отправителя именьшее поле к его вершине (сообщение 1).
Однако сообщение 3 также от того же отправителя, у него нет имени отправителя (поэтому я знаю, что bool установлен правильно), но оно имеет поле по умолчанию:его вершина (сообщение 2).

Я предполагаю, что установка вставки, как я сделал (что я получил от здесь ), не работает должным образом, потому что она просто сдвигает contentView ячейки вверх. Мне нужно, чтобы каждое последующее сообщение от одного и того же отправителя имело небольшой запас по сравнению со своим предшественником до тех пор, пока между ним не появится сообщение от другого отправителя или не появится сообщение в другой день.

Как лучше всего установить расстояние между двумя ячейками в зависимости от произвольной проверки для каждой ячейки?

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Решение UICollectionView

Это может быть большее изменение, чем то, что вы ищете, но я бы определенно использовал для этого collectionView, так что вы получите доступ к промежуточному интервалу и интервалу раздела. Если я понимаю UITableView, у него нет промежутка для элементов

Теперь поместите последовательные сообщения от одного и того же участника в один и тот же раздел и откройте новый раздел для следующей группы (последовательные сообщения от другого участника). ) . Подкласс FlowLayoutDelegation и переопределить minimumInteritemSpacingForSectionAt и minimumLineSpacingForSectionAt. Быстро и просто, без необходимости писать макет.

Если вы решите сделать это, я могу дать вам более подробную информацию.

Решение UITableView

Одинбольше возможностей для TableView. Настройте обычные вставки ячеек и отступы на все, что вам нужно для сообщений от одного пользователя в одном разделе, и увеличьте «невидимый» заголовок, который будет разделять группы. Вам все еще нужны разделы.

0 голосов
/ 16 октября 2019

Я выбрал следующий подход:

Класс ячейки имеет IBOutlet для верхнего ограничения. Xib связывает верхнее ограничение ячейки с выходом. В классе у меня есть сеттер для установки верхнего ограничения на меньшее значение, чем его значение по умолчанию. С dequeuecell, где у меня есть доступ к bool модели, я звоню этому сеттеру, чтобы соответственно установить верхнее поле.

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

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