Swift:在 UICollectionView 中处理唯一/可变单元格间距的最佳方法?

问题描述

这是 iMessage 的图片。您可以看到红色圆圈显示的消息之间的差距比橙色圆圈更大。

enter image description here

假设每个单元格都是聊天气泡之一:在 UIKit 中实现这种可变单元格间距的最佳方法是什么?

我有两个想法:

  1. 找到一种使用 UICompositionalLayout 实现可变项目间距的方法..?
  2. 使用我的 UICollectionView 注册一个具有额外填充的唯一单元格,并在我需要额外填充时deque

有人对实现 UICollectionViewLayout 的可变单元格间距的最佳做法有什么建议吗?

谢谢!

解决方法

更新:感谢@Larme 的评论,我轻松轻松地实现了这一目标:

func getLayout() -> UICollectionViewCompositionalLayout {
    let size = NSCollectionLayoutSize.init(widthDimension: .fractionalWidth(1.0),heightDimension: .estimated(50))
    let item = NSCollectionLayoutItem.init(layoutSize: size)
    let group = NSCollectionLayoutGroup.horizontal(layoutSize: size,subitems: [item])
    let section = NSCollectionLayoutSection.init(group: group)
    section.interGroupSpacing = 2.0 // group spacing
    let config = UICollectionViewCompositionalLayoutConfiguration()
    config.interSectionSpacing = 16 // section spacing
    return UICollectionViewCompositionalLayout.init(section: section,configuration: config)
}

然后,它就像拥有一个函数来决定何时追加到上一节与初始化一个新节一样简单。这是我的一个例子:

func addMessages(_ messages:[Message]) {
    var snap = self.data.snapshot()
    
    for i in messages {
        // If prev and current message has same origin,use prev section
        if snap.sectionIdentifiers.last?.origin == i.origin {
            snap.appendItems([i],toSection: snap.sectionIdentifiers.last!)
        // Else create a new section
        } else {
            snap.appendSections([Section(origin: i.origin)])
            snap.appendItems([i],toSection: snap.sectionIdentifiers.last!)
        }
    }
                    
    self.data.apply(snap)
}