mar*_*ioa 43 ios uicollectionview swift
如何在swift中的集合视图中创建页眉和页脚?
我正在尝试将页眉和页脚组合在一起,但它一直在崩溃,我找不到快速的教程来理解它.
我不知道如何只返回一个补充视图.
我在故事板上设置它们(类+标识符)
 override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    //#warning Incomplete method implementation -- Return the number of sections
    return 2
}
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    //#warning Incomplete method implementation -- Return the number of items in the section
    return 10
}
override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
    var header: headerCell!
    var footer: footerCell!
    if kind == UICollectionElementKindSectionHeader {
        header =
            collectionView.dequeueReusableSupplementaryViewOfKind(kind,
                withReuseIdentifier: "header", forIndexPath: indexPath)
            as? headerCell
}
    return header
}
错误: 标识符为1的UICollectionElementKindCell - 必须为标识符注册一个nib或类或连接一个storyboard中的原型单元格'
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> profileCC {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("one", forIndexPath: indexPath) as! profileCC
    // Configure the cell
    return cell
}
override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
    switch kind {
    case UICollectionElementKindSectionHeader:
        let headerView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "header", forIndexPath: indexPath) as! headerCell
        headerView.backgroundColor = UIColor.blueColor();
        return headerView
    case UICollectionElementKindSectionFooter:
        let footerView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "footer", forIndexPath: indexPath) as! footerCell
        footerView.backgroundColor = UIColor.greenColor();
        return footerView
    default:
        assert(false, "Unexpected element kind")
    }
}
我希望有人会帮忙.
Vic*_*ler 72
你可以做一个UICollectionViewController处理UICollectionView,并在Interface Builder激活页脚和页眉部分,然后你可以使用你预览下面的方法UICollectionView两个部分补充说:
override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
    switch kind {
    case UICollectionView.elementKindSectionHeader:
        let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "Header", for: indexPath)
        headerView.backgroundColor = UIColor.blue
        return headerView
    case UICollectionView.elementKindSectionFooter:
        let footerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "Footer", for: indexPath)
        footerView.backgroundColor = UIColor.green
        return footerView
    default:
        assert(false, "Unexpected element kind")
    }
在上面的代码我把identifier页脚和头作为Header和Footer例如,你可以做你想要的.如果要创建自定义页眉或页脚,则需要UICollectionReusableView为每个创建子类,并根据需要对其进行自定义.
您可以通过以下方式在Interface Builder或代码中注册自定义页脚和标题类:
registerClass(myFooterViewClass, forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier: "myFooterView")
mob*_*cat 25
针对Swift 3+进行了更新
步骤1:
在视图控制器类中,注册要用作页眉,页脚或两者的类:
let collectionViewHeaderFooterReuseIdentifier = "MyHeaderFooterClass"
第2步:
如果使用xib,请使用:
collectionView.register(UINib(nibName: collectionViewHeaderFooterReuseIdentifier bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier:collectionViewHeaderFooterReuseIdentifier)
collectionView.register(UINib(nibName: collectionViewHeaderFooterReuseIdentifier bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier:collectionViewHeaderFooterReuseIdentifier)
如果不使用xib:
collectionView.register(MyHeaderFooterClass.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: collectionViewHeaderFooterReuseIdentifier)
collectionView.register(MyHeaderFooterClass.self, forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier: collectionViewHeaderFooterReuseIdentifier)
第3步:
创建自定义页眉/页脚类,实现如下:
import UIKit
class MyHeaderFooterClass: UICollectionReusableView {
 override init(frame: CGRect) {
    super.init(frame: frame)
    self.backgroundColor = UIColor.purple
    // Customize here
 }
 required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
 }
}
第4步: 如果不使用xib,请忽略
创建一个新的空xib:"文件 - >新文件 - >空".
将其命名为与类完全相同的名称.在这个例子中:"MyHeaderFooterClass"
步骤5: - 通过委托方法支持集合视图中的新单元格:
 func collectionView(_ collectionView: UICollectionView,
                    viewForSupplementaryElementOfKind kind: String,
                    at indexPath: IndexPath) -> UICollectionReusableView {
    switch kind {
    case UICollectionElementKindSectionHeader:
        let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: collectionViewHeaderFooterReuseIdentifier, for: indexPath)
        headerView.backgroundColor = UIColor.blue
        return headerView
    case UICollectionElementKindSectionFooter:
        let footerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: collectionViewHeaderFooterReuseIdentifier, for: indexPath)
        footerView.backgroundColor = UIColor.green
        return footerView
    default:
        assert(false, "Unexpected element kind")
    }
}
gen*_*ius 12
In addition to all answers above
To activate the Footer and Header sections
Select your collection then select Attributes inspector and check on the Footer and Header sections
like in photo
只是为了补充其余的答案,不要忘记为页眉/页脚视图分配空间,否则collectionView:viewForSupplementaryElementOfKind:atIndexPath 将不会被调用。
为此,请collectionView:layout:referenceSizeForHeaderInSection在您的collectionView数据源中实现。
使用@mobilecat 代码后,您应该使用此功能使页眉和页脚出现
 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
        return CGSize(width: collectionView.frame.width, height: 180.0)
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {
        return CGSize(width: 60.0, height: 30.0)
    }
Xcode 11+ & iOS 13+
I am using Xib for creating Header & Footer Views
class HeaderViewCV: UICollectionReusableView {
}
collectionView.register(UINib(nibName: "HeaderViewCV", bundle: nil), forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "HeaderViewCV") //elementKindSectionFooter for footerview
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    
   switch kind {
                
   case UICollectionView.elementKindSectionHeader:
            let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "HeaderViewCV", for: indexPath)
            return headerView
            
    case UICollectionView.elementKindSectionFooter:
            let footerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "FooterViewCV", for: indexPath)
            return footerView
            
     default:
            assert(false, "Unexpected element kind")
    }
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
    return CGSize(width: self.collectionView.frame.width, height: 55)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {
    return CGSize(width: self.collectionView.frame.width, height: 67)
}