具有组合布局的集合视图不适用于标题视图

Posted

技术标签:

【中文标题】具有组合布局的集合视图不适用于标题视图【英文标题】:Collection view with Compositional Layout not working for header view 【发布时间】:2020-04-18 12:46:39 【问题描述】:

尝试使用compositionalLayout 创建UICollectionView。它适用于集合视图单元格,但是当我尝试添加标题时,它会因注册笔尖错误而崩溃:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法将类型视图出列:带有标识符 headerView 的 SectionHeaderElementKind - 必须为标识符注册一个 nib 或类或连接故事板中的原型单元格”

视图控制器的代码实现:

class ViewController: UIViewController 

    @IBOutlet weak var collectionView: UICollectionView!

    override func viewDidLoad() 
        super.viewDidLoad()

        collectionView.register(UINib(nibName: "CollectionReusableView", bundle: nil), forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "headerView")
        collectionView.register(UINib(nibName: "CollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "cellIdentifier")
        collectionView.collectionViewLayout = customLayout()
     

    func customLayout() -> UICollectionViewLayout 

        let size = NSCollectionLayoutSize(
            widthDimension: NSCollectionLayoutDimension.fractionalWidth(1),
            heightDimension: NSCollectionLayoutDimension.estimated(44)
        )
        let item = NSCollectionLayoutItem(layoutSize: size)
        let group = NSCollectionLayoutGroup.horizontal(layoutSize: size, subitem: item, count: 1)

        let headerSize = NSCollectionLayoutSize(
            widthDimension: .fractionalWidth(1.0),
            heightDimension: .absolute(40)
        )
        let sectionHeader = NSCollectionLayoutBoundarySupplementaryItem(
            layoutSize: headerSize,
            elementKind: "SectionHeaderElementKind",
            alignment: .top
        )

        let section = NSCollectionLayoutSection(group: group)
        section.boundarySupplementaryItems = [sectionHeader]
        let layout = UICollectionViewCompositionalLayout(section: section)
        return layout
    


extension ViewController: UICollectionViewDataSource 

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        return 5
    

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellIdentifier", for: indexPath) as! CollectionViewCell

        return cell
    

    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView 
        let cell = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "headerView", for: indexPath) as! CollectionReusableView

        return cell
    

我创建的标题视图:

class CollectionReusableView: UICollectionReusableView 

    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code
    


如果我在这里遗漏了什么,请帮忙。

【问题讨论】:

【参考方案1】:

在构建布局和将可重用视图注册到集合视图时,您应该对元素类型使用相同的值..

改变这个:

collectionView.register(UINib(nibName: "CollectionReusableView", bundle: nil), forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "headerView")

collectionView.register(UINib(nibName: "CollectionReusableView", bundle: nil), forSupplementaryViewOfKind: "SectionHeaderElementKind", withReuseIdentifier: "headerView")

【讨论】:

以上是关于具有组合布局的集合视图不适用于标题视图的主要内容,如果未能解决你的问题,请参考以下文章

焦点引擎不适用于集合视图单元

集合视图组合布局 - 动态布局

更改集合视图的 isHidden 属性不适用于搜索栏取消按钮

如何在具有组合布局的新集合视图中将 CAGradientLayer 添加到 UIBackgroundConfiguration?

集合视图,具有自定义布局,单元格在滚动时行为不端

滚动圆形布局集合视图