情况:
我有聊天 View 。它类似于 whatsapp,不同的日子有一个小标题显示日期。我通过为每个单独的日期制作一个部分并在部分标题中显示日期来做到这一点。
如果上一条消息来自不同的发件人,则单元格会显示发件人的姓名。所以如果
- 消息 1 来自 Alice
- 消息 2 和 3 来自 Bob
- 消息 4 和 5 来自 Alice
然后消息 1、2 和 4 将显示发件人姓名。这很简单,只需在映射过程中从 api 获取消息模型后在消息模型上设置一个 bool 即可。单元格检查此 bool 值并设置或不设置发件人姓名标签文本。
我也必须根据此更改单元格之间的空间。如果单元格未显示发件人姓名,例如它与前一条消息来自同一发送者,它与前一条消息之间的余量应该较小。如果该单元格是该部分中最顶部的单元格,则边距应保持原样。
我尝试像这样覆盖 layoutSubviews
:
override func layoutSubviews() {
super.layoutSubviews()
bounds = bounds.inset(by: UIEdgeInsets(top: topInset, left: 0, bottom: 0, right: 0))
}
topInset
是我在 cell dequeue 中设置的 CGFloat,如下所示:
cell.topInset = item.isSenderSameAsPrevious && indexPath.row > 0 ? 10 : 0
item
是我的消息模型。
问题:
消息 1 有发件人姓名和顶部的默认边距(部分标题),消息 2 来自同一发件人,没有发件人姓名和顶部(消息 1)的较小边距。< br/> 然而,消息 3 也来自同一个发件人,它没有发件人姓名(所以我知道 bool 设置正确)但它的顶部有一个默认边距(消息 2)。
我假设像我所做的那样设置插图(我从 here 获得)没有按预期工作,因为它只是将单元格的 contentView 向上移动。我需要的是来自同一发件人的每条后续消息与其前身的消息之间有一个小的余量,直到来自不同发件人的消息介于两者之间或消息在不同的一天。
根据对每个单元格的任意检查,设置两个单元格之间空间的最佳方法是什么?
最佳答案
UICollectionView 解决方案
这可能比您正在寻找的变化更大,但我肯定会为此使用 collectionView,因此您可以访问中间间距和部分间距。如果我理解 UITableView,它没有项目间距
现在将来自同一参与者的连续消息放入同一部分,并为下一组(来自其他参与者的连续消息)打开一个新部分。将 FlowLayoutDelegation 子类化并覆盖 minimumInteritemSpacingForSectionAt
和 minimumLineSpacingForSectionAt
。无需编写布局即可快速简单。
如果您决定这样做,我可以为您提供更多详细信息。
UITableView解决方案
TableView 多了一个选项。将您的正常单元格插入和填充设置为您在一个部分中为来自同一用户的消息所需的任何内容,并使“不可见”标题更大以分隔组。您仍然需要这些部分。
关于ios - 同一部分内单元格之间的可变空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58409066/