如何将标头视图添加到UICollectionView

时间:2017-10-31 14:50:08

标签: ios swift uicollectionview

这些是我将自己的视图添加为标题的步骤:

创建新视图:

class HeaderView: UICollectionReusableView {
    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        self.backgroundColor = .red
    }
}

viewDidLoad内注册视图:

    self.collectionView?.register(HeaderView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "header")

实施referenceSizeForHeaderInSection委托:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
    return CGSize(width:view.frame.size.width, height:100.0)
}

实施viewForSupplementaryElementOfKind委托:

   func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
        switch kind {
        case UICollectionElementKindSectionHeader:
            let header = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "header", for: indexPath) as! HeaderView
            header.setNeedsLayout()
            return header

        default:
            return UICollectionReusableView()
        }
    }

但它并不起作用。运行应用时,我的referenceSizeForHeaderInSectionviewForSupplementaryElementOfKind未被调用。

我确实在viewDidLoad内设置了我的代表:

self.collectionView?.delegate = self

我错过任何一步吗?或者我做错了什么?

编辑:

忘记提及:我使用的是自定义布局,不确定是否重要,但在选择自定义布局的故事板中,Section Header选项会消失。

1 个答案:

答案 0 :(得分:1)

在您的情况下,您需要正确配置您的布局以显示部分标题。

使用自定义布局时,根本不需要实现referenceSizeForHeaderInSection。这是UICollectionViewDelegateFlowLayout的一种方法。这就是没有被召唤的原因。