ios - 如何在集合视图中合并两个不同的部分

ios - How to merge two different sections in collection view

我想合并分别使用两个不同单元格(单元格 A 和单元格 B)的两个不同部分。使用以下代码,我可以获得包含两个部分的集合视图。

import UIKit

class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource{

    @IBOutlet var testCollectionView: UICollectionView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.testCollectionView.delegate = self
        self.testCollectionView.dataSource = self
    }
   
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 2
    }
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if section == 0 {
            return 3
        } else {
            return 1
        }
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        if indexPath.section == 0 {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "taskCell", for: indexPath) as! CellA
            cell.layer.cornerRadius = 2
            cell.layer.shadowColor = UIColor(red:0.82, green:0.82, blue:0.82, alpha:1.0).cgColor
            cell.layer.shadowOffset = CGSize.zero
            cell.layer.shadowOpacity = 1
            cell.layer.shadowRadius = 4
            cell.layer.masksToBounds = false
            return cell
        } else {
            let cell2 = collectionView.dequeueReusableCell(withReuseIdentifier: "addNewCell", for: indexPath) as! CellB
            return cell2
        }
    }
}

extension ViewController: UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        
        let width = testCollectionView.bounds.width/2 - 30
        let height = width
        
        return CGSize(width: width, height: height)
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsetsMake(30, 20, 10, 20)
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 20
    }
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        print(indexPath.row)
    }
}

输出如下所示。

现在,我希望将部分 1(CellB) 与部分 0(CellA) 合并。像这样。

我找不到实现此目的的解决方案。任何帮助将不胜感激。

您可以通过以下更改在同一部分中显示两种单元格类型:

  1. aCellsbCells 添加属性。这比在您的代码中放入 幻数 31 更好,因为它记录了数字代表的内容。如果您需要更改它们,可以在一处进行更改。
  2. numberOfSections 更改为 return 1
  3. numberOfItemsInSection改为returnA格数与B格数之和:return aCells + bCells.
  4. cellForItemAt 中,比较 indexPath.itemaCells 以确定何时切换到 B 细胞。

var aCells = 3
var bCells = 1

func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return aCells + bCells
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    if indexPath.item < aCells {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "taskCell", for: indexPath) as! CellA
        cell.layer.cornerRadius = 2
        cell.layer.shadowColor = UIColor(red:0.82, green:0.82, blue:0.82, alpha:1.0).cgColor
        cell.layer.shadowOffset = CGSize.zero
        cell.layer.shadowOpacity = 1
        cell.layer.shadowRadius = 4
        cell.layer.masksToBounds = false
        return cell
    } else {
        let cell2 = collectionView.dequeueReusableCell(withReuseIdentifier: "addNewCell", for: indexPath) as! CellB
        return cell2
    }
}