我正在努力尝试在我的集合视图中使用每个部分的标题执行多个部分.我不知道Obj-C,我已经找到了很多教程,但还是没能弄清楚如何将它转换成Swift.
我的所有数据都是静态的,所以我需要的是某种类型的数组或字典,我可以使用它来创建多个部分.我已经有一个包含1个部分的集合视图,所以如果您有多个部分的见解或代码可以提供帮助.
我知道如何设置多个部分
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return sectionData.count
}
我认为我需要帮助的主要是实现这个功能
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { }
并设置数据!
UICollectionView和UITableView几乎完全相同,所以如果你知道如何在Swift的UITableView中做多个部分,你的帮助也很感激
1> 小智..:
该cellForItemAtIndexPath
函数处理用单元格填充每个部分,它不处理部分或补充视图,因此在创建部分标题时,您不需要帮助.
你需要实现的方法是viewForSupplementaryElementOfKind
.它的签名是:
func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {}
假设您的collectionView在1节中正常工作(您已正确填写了cellForItemAtIndexPath的主体,并且您的sectionData数组正确反映了您要显示的节数),您应该能够使用以下指针实现节标题:
与单元格一起,UICollectionView
还支持"补充"视图对象,通常用于页眉或页脚.这些补充视图与UICollectionViewCell
对象的行为非常相似.与cellForItemAtIndexPath
处理单元格的方式相同,该viewForSupplementaryElementOfKind
函数处理补充视图.
要实现它,您需要首先准备ViewController来执行此操作.首先编辑您的布局对象以反映适当的标题大小,每个标题将遵循:
let layout: UICollectiOnViewFlowLayout= UICollectionViewFlowLayout()
layout.headerReferenceSize = CGSize(width: self.view.frame.size.width, height: 30)
注意:我正在使用UICollectionViewFlowLayout
接下来,如果您还没有这样做,请创建一个SectionHeader类来定义每个节头对象,这样您就可以使用collectionView对象注册该类,如下所示:
collectionView!.registerClass(SectionHeaderView.self, forSupplementaryViewOfKind:UICollectionElementKindSectionHeader, withReuseIdentifier: "SectionHeaderView");
这里,传入的第一个和第三个参数与UICollectionViewCell类注册相同,此方法中的第一个参数是对您创建的节头类的引用.第三个是补充视图的重用标识符.
第二个参数特定于Supplementary Views,它设置SupplementaryView的类型,在这种情况下是一个头,UICollectionViewFlowLayout类提供的常量字符串UICollectionElementKindSectionHeader
用于它.如果你注意到的参数viewForSupplementaryElementOfKind
,这样以后传入的kind: String
参数.
用与viewForSupplementaryElementOfKind
cellForItemAtIndexPath函数相同的方式填充正文 - 使用该dequeueReusableSupplementaryViewOfKind
方法创建SectionHeader对象,然后根据需要设置任何属性(标签,颜色等),最后返回标题对象.
希望这可以帮助!!
参考点:
https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UICollectionViewDataSource_protocol/index.html#//apple_ref/occ/intfm/UICollectionViewDataSource/
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UICollectionViewFlowLayout_class/index.html#//apple_ref/c/data/UICollectionElementKindSectionHeade
2> Tarun..:
定义您的UICollectionViewCell,它将是您的UICollectionElementKindSectionHeader类型的Header视图-在我的情况下,我有两个标头-OfferHeaderCell和APRHeaderCell定义如下:
verticalCollectionView.register(UINib(nibName: "OfferHeaderCell", bundle: nil), forSupplementaryViewOfKind:UICollectionElementKindSectionHeader, withReuseIdentifier: "OfferHeaderCell")
verticalCollectionView.register(UINib(nibName: "APRHeaderCell", bundle: nil), forSupplementaryViewOfKind:UICollectionElementKindSectionHeader, withReuseIdentifier: "APRHeaderCell")
继续并为每个节返回标题,然后在此UICollectionViewDelegateFlowLayout函数中将节标题的大小设置为零。
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
if(section==0) {
return CGSize.zero
} else if (section==1) {
return CGSize(width:collectionView.frame.size.width, height:133)
} else {
return CGSize(width:collectionView.frame.size.width, height:100)
}
}
为以下两个不同的部分定义viewForSupplementaryElementOfKind很重要:
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
var reusableview = UICollectionReusableView()
if (kind == UICollectionElementKindSectionHeader) {
let section = indexPath.section
switch (section) {
case 1:
let firstheader: OfferHeaderCell = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "OfferHeaderCell", for: indexPath) as! OfferHeaderCell
reusableview = firstheader
case 2:
let secondHeader: APRHeaderCell = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "APRHeaderCell", for: indexPath) as! APRHeaderCell
reusableview = secondHeader
default:
return reusableview
}
}
return reusableview
}
最后是数据源
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 3
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if (section==2) {
return 2
}
return 0
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = verticalCollectionView.dequeueReusableCell(withReuseIdentifier: "ReviseOfferCell", for: indexPath)
cell.backgroundColor = UIColor.white
return cell
}
注意:不要忘记添加UICollectionFlowLayout,如下所示:
//标记:UICollectionViewDelegateFlowLayout
extension MakeAnOfferController: UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
if indexPath.item == 0 {
return CGSize(width: self.view.frame.size.width, height: 626.0)
}
return CGSize()
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
if(section==0) {
return CGSize.zero
} else if (section==1) {
return CGSize(width:collectionView.frame.size.width, height:133)
} else {
return CGSize(width:collectionView.frame.size.width, height:100)
}
}
}
3> 小智..:
这是对我有用的代码
创建标题单元格。为此,我创建了一个自定义单元格类和一个笔尖以在图形编辑器中对单元格进行自定义
在viewDidLoad中添加以下内容
self.collectionView?.registerNib(UINib(nibName: "KlosetCollectionHeaderViewCell", bundle: nil), forSupplementaryViewOfKind:UICollectionElementKindSectionHeader, withReuseIdentifier: "HeaderCell")
然后添加委托函数
override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> KlosetCollectionHeaderViewCell {
let headerCell = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "HeaderCell", forIndexPath: indexPath) as? KlosetCollectionHeaderViewCell
return headerCell!
}
这会将HeaderCell放入PFCollectionView的SectionView中。在单元格中显示的控件将它们添加到xib文件以及插座和动作