迁移至UICollectionLayoutListConfiguration时如何保留原布局的行间距、内边距及单元格样式
迁移至UICollectionLayoutListConfiguration时如何保留原布局的行间距、内边距及单元格样式
嗨,我来帮你搞定这个问题!当切换到UICollectionLayoutListConfiguration时,系统默认的列表单元格逻辑会覆盖你之前自定义的一些设置,不过咱们一步步把原来的效果找回来就行:
1. 恢复行间距和内边距
你之前在NSCollectionLayoutSection里设置的interGroupSpacing和contentInsets,在UICollectionLayoutListConfiguration里可以直接通过配置对象来对应设置,只是属性名略有不同:
- 内边距:直接给
listConfig.contentInsets赋值,和你原来的section内边距保持一致 - 行间距:用
listConfig.minimumItemSpacing来替代原来的interGroupSpacing
修改后的layoutConfig方法示例:
private func layoutConfig() -> UICollectionViewCompositionalLayout { var listConfig = UICollectionLayoutListConfiguration(appearance: .plain) listConfig.showsSeparators = false // 设置和原布局一致的内边距 listConfig.contentInsets = NSDirectionalEdgeInsets(top: 8, leading: 8, bottom: 8, trailing: 8) // 设置行间距,对应原来的interGroupSpacing listConfig.minimumItemSpacing = 4 listConfig.trailingSwipeActionsConfigurationProvider = { indexPath -> UISwipeActionsConfiguration? in return UISwipeActionsConfiguration( actions: [ UIContextualAction( style: .destructive, title: "Delete", handler: { [weak self] (_, _, completion) in // 记得在这里添加实际的删除逻辑,比如更新数据源后刷新collectionView completion(true) }) ] ) } return UICollectionViewCompositionalLayout.list(using: listConfig) }
2. 找回圆角与半透明背景
这部分有两种方案,取决于你是否要继续使用自定义的ChecklistCell:
方案一:继续使用自定义ChecklistCell
系统的列表配置默认会使用UICollectionViewListCell,所以你需要通过UICollectionView.CellRegistration来注册你的自定义cell,同时确保cell的样式不会被系统覆盖:
首先调整你的ChecklistCell,确保背景层级正确:
class ChecklistCell: UICollectionViewCell { @IBOutlet weak var rowView: UIView! override func awakeFromNib() { super.awakeFromNib() initRowView() // 让cell本身背景透明,保证自定义的rowView能正常显示 self.backgroundColor = .clear } private func initRowView() { rowView.layer.cornerRadius = 22 rowView.layer.masksToBounds = false // 如果需要阴影效果,可以加上下面的配置 rowView.layer.shadowColor = UIColor.black.cgColor rowView.layer.shadowOffset = CGSize(width: 0, height: 2) rowView.layer.shadowOpacity = 0.1 rowView.layer.shadowRadius = 4 rowView.backgroundColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 0.5) } // 覆盖系统的配置更新方法,防止自定义样式被系统状态覆盖 override func updateConfiguration(using state: UICellConfigurationState) { super.updateConfiguration(using: state) initRowView() } }
然后在ViewController里注册并使用这个cell:
// 先定义cell注册器(替换YourDataType为你实际的数据类型) private let cellRegistration = UICollectionView.CellRegistration<ChecklistCell, YourDataType> { cell, indexPath, item in // 在这里配置cell的内容,比如设置文本、图标等 } // 在collectionView的cellForItemAt方法中使用 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let item = yourDataSource[indexPath.item] return collectionView.dequeueConfiguredReusableCell(using: cellRegistration, for: indexPath, item: item) }
方案二:使用系统UICollectionViewListCell,自定义背景配置
如果你不想维护自定义cell,可以直接通过UIBackgroundConfiguration来设置圆角和半透明背景,这更符合ListConfiguration的设计模式:
// 定义cell注册器 private let cellRegistration = UICollectionView.CellRegistration<UICollectionViewListCell, YourDataType> { cell, indexPath, item in // 配置单元格内容(替换成你的实际内容) var contentConfig = UIListContentConfiguration.plainCell() contentConfig.text = item.title cell.contentConfiguration = contentConfig // 配置背景样式 var backgroundConfig = UIBackgroundConfiguration.listPlainCell() backgroundConfig.backgroundColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 0.5) backgroundConfig.cornerRadius = 22 // 可选:添加阴影效果 backgroundConfig.shadowColor = UIColor.black.cgColor backgroundConfig.shadowOffset = CGSize(width: 0, height: 2) backgroundConfig.shadowOpacity = 0.1 backgroundConfig.shadowRadius = 4 cell.backgroundConfiguration = backgroundConfig }
这样设置后,系统会自动管理cell的背景状态,同时保留你需要的圆角和半透明效果,也不会和滑动删除功能冲突。
备注:内容来源于stack exchange,提问作者Cheok Yan Cheng
相关产品推荐
相关产品推荐

