Swift4.2 UICollectionView 基本用法
2018-06-27 本文已影响6366人
YDomo
先看效果图
github源码https://github.com/daomoer/YYSwiftLearnDemos/tree/master/YYCollectionView
UICollectionViewFlowLayout布局类的初始化以及item的大小相关设置
let layout = UICollectionViewFlowLayout.init()
layout.itemSize = CGSize(width: 60, height: 60)
layout.minimumLineSpacing = 5
layout.minimumInteritemSpacing = 5
layout.scrollDirection = .vertical
layout.sectionInset = UIEdgeInsets.init(top: 5, left: 5, bottom: 5, right: 5)
// 设置分区头视图和尾视图宽高
layout.headerReferenceSize = CGSize.init(width: ScreenWidth, height: 80)
layout.footerReferenceSize = CGSize.init(width: ScreenWidth, height: 80)
UICollectionView初始化和代理设置
collectionView = UICollectionView.init(frame: CGRect(x:0, y:64, width:ScreenWidth, height:400), collectionViewLayout: layout)
collectionView?.backgroundColor = UIColor.white
collectionView?.delegate = self
collectionView?.dataSource = self
self.view.addSubview(collectionView!)
自定义cell的注册,以及头视图尾视图的注册
// 注册cell
collectionView?.register(UINib.init(nibName: "CollectionViewCell", bundle: nil), forCellWithReuseIdentifier: Identifier)
// 注册headerView
collectionView?.register(CollectionHeaderView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: headerIdentifier)
// 注册footView
collectionView?.register(CollectionFootView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier: footIdentifier)
cell代理方法
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 18
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell:CollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: Identifier, for: indexPath) as! CollectionViewCell
cell.bgView.backgroundColor = armColor()
cell.titleLabel.text = String(format:"%ditem",indexPath.row)
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print(indexPath.row)
}
func armColor()->UIColor{
let red = CGFloat(arc4random()%256)/255.0
let green = CGFloat(arc4random()%256)/255.0
let blue = CGFloat(arc4random()%256)/255.0
return UIColor(red: red, green: green, blue: blue, alpha: 1.0)
}
头视图和尾视图的代理方法
有个问题,代理方法设置了头视图和尾视图的宽高,但是最终显示不出来头视图和尾视图
// //header高度
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
return CGSize.init(width: ScreenWidth, height: 80)
}
//footer高度
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {
return CGSize.init(width: ScreenWidth, height: 80)
}
最后换了在初始化layout的时候设置头、尾视图的宽高最终显示出来
// 设置分区头视图和尾视图宽高
layout.headerReferenceSize = CGSize.init(width: ScreenWidth, height: 80)
layout.footerReferenceSize = CGSize.init(width: ScreenWidth, height: 80)
头视图和尾视图内容处理代理方法
//设定header和footer的方法,根据kind不同进行不同的判断即可
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
if kind == UICollectionElementKindSectionHeader{
let headerView : CollectionHeaderView = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: headerIdentifier, for: indexPath) as! CollectionHeaderView
headerView.view.backgroundColor = UIColor.red
headerView.label.text = "This is HeaderView"
return headerView
}else{
let footView : CollectionFootView = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionFooter, withReuseIdentifier: footIdentifier, for: indexPath) as! CollectionFootView
footView.view.backgroundColor = UIColor.purple
footView.label.text = "This is Foot"
return footView
}
}
最后是整个controller中所有代码
import UIKit
let ScreenWidth = UIScreen.main.bounds.width
let ScreenHeight = UIScreen.main.bounds.height
class ViewController: UIViewController ,UICollectionViewDataSource, UICollectionViewDelegate{
var collectionView : UICollectionView?
let Identifier = "CollectionViewCell"
let headerIdentifier = "CollectionHeaderView"
let footIdentifier = "CollectionFootView"
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.title = "UICollectionView小解"
self.view.backgroundColor = UIColor.white
// 初始化
let layout = UICollectionViewFlowLayout.init()
layout.itemSize = CGSize(width: 60, height: 60)
layout.minimumLineSpacing = 5
layout.minimumInteritemSpacing = 5
layout.scrollDirection = .vertical
layout.sectionInset = UIEdgeInsets.init(top: 5, left: 5, bottom: 5, right: 5)
// 设置分区头视图和尾视图宽高
layout.headerReferenceSize = CGSize.init(width: ScreenWidth, height: 80)
layout.footerReferenceSize = CGSize.init(width: ScreenWidth, height: 80)
collectionView = UICollectionView.init(frame: CGRect(x:0, y:64, width:ScreenWidth, height:400), collectionViewLayout: layout)
collectionView?.backgroundColor = UIColor.white
collectionView?.delegate = self
collectionView?.dataSource = self
self.view.addSubview(collectionView!)
// 注册cell
collectionView?.register(UINib.init(nibName: "CollectionViewCell", bundle: nil), forCellWithReuseIdentifier: Identifier)
// 注册headerView
collectionView?.register(CollectionHeaderView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: headerIdentifier)
// 注册footView
collectionView?.register(CollectionFootView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier: footIdentifier)
}
// //header高度
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
return CGSize.init(width: ScreenWidth, height: 80)
}
//footer高度
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {
return CGSize.init(width: ScreenWidth, height: 80)
}
//设定header和footer的方法,根据kind不同进行不同的判断即可
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
if kind == UICollectionElementKindSectionHeader{
let headerView : CollectionHeaderView = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: headerIdentifier, for: indexPath) as! CollectionHeaderView
headerView.view.backgroundColor = UIColor.red
headerView.label.text = "This is HeaderView"
return headerView
}else{
let footView : CollectionFootView = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionFooter, withReuseIdentifier: footIdentifier, for: indexPath) as! CollectionFootView
footView.view.backgroundColor = UIColor.purple
footView.label.text = "This is Foot"
return footView
}
}
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 18
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell:CollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: Identifier, for: indexPath) as! CollectionViewCell
cell.bgView.backgroundColor = armColor()
cell.titleLabel.text = String(format:"%ditem",indexPath.row)
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print(indexPath.row)
}
func armColor()->UIColor{
let red = CGFloat(arc4random()%256)/255.0
let green = CGFloat(arc4random()%256)/255.0
let blue = CGFloat(arc4random()%256)/255.0
return UIColor(red: red, green: green, blue: blue, alpha: 1.0)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
总结
关于设置代理方法设置了头视图和尾视图的宽高,但是最终显示不出来头视图和尾视图,需要遵守UICollectionViewDelegateFlowLayout协议