问题: 想在初始化UICollectionViewCell的时候,根据类型来区分布局?
我们知道 复用的UICollectionViewCell 都是通过initWithFrame 来初始化的。
但是这个函数,如我们增加了一个参数,新增的这个参数如何传值进去呢?
方案:重写 UICollectionViewCell的初始化函数,写上需要的参数,然后根据需要的参数类型,分别写几个子cell,在 UICollectionView 注册cell时,分别根据类型注册子cell。 在UICollectionView的创建cell代理方法中,使用父cell。
注册cell:
let cv = UICollectionView.init(frame: .zero, collectionViewLayout: layout)
cv.backgroundColor = .white
cv.dataSource = self
self.view.addSubview(cv)
///这里分别注册不同类型的cell
if type == .wechat {
cv.register(WechatVideoCell.self, forCellWithReuseIdentifier: "cell")
}else if type == .bilibili{
cv.register(BiliVideoCell.self, forCellWithReuseIdentifier: "cell")
}else if type == .tiktok {
cv.register(TiktokVideoCell.self, forCellWithReuseIdentifier: "cell")
}
cell的代理代码:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as? VideoCell
cell?.model = self.datas?[indexPath.row]
return cell ?? UICollectionViewCell()
}
示例Cell代码:
// MARK: - Cell
class VideoCell: UICollectionViewCell {
var titleL = UILabel()
var coverView = UIImageView()
var timeL = UILabel()
var model: CellModel?{
didSet{
titleL.text = model?.title
coverView.image = UIImage.init(named: model?.cover ?? "")
}
}
init(frame: CGRect, type: ListType) {
super.init(frame: frame)
//针对不同的类型,做你想做的事 😄
var titleH: CGFloat = 20.0
if type == .wechat {
titleH = 20.0
VStack(titleL,coverView).embedIn(self.contentView)
}else if type == .bilibili {
titleH = 30.0
VStack(coverView).embedIn(self.contentView)
HStack(titleL).embedIn(self.contentView).align(.center)
}else if type == .tiktok {
titleH = 40.0
VStack(coverView,titleL).embedIn(self.contentView)
}
titleL.align(.center).color("#FFF")
titleL.pin(.h(titleH),.lowHugging).bg("random")
coverView.mode(.scaleAspectFill).pin(.lowHugging)
self.backgroundColor = Color("#EEE")
coverView.clipsToBounds = true
}
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class CellModel: NSObject {
var title: String?
var cover: String?
}
// MARK: - 用来作为传参的子cell
class WechatVideoCell: VideoCell{
override init(frame: CGRect) {
//这里调用父类的时候,指定类型
super.init(frame: frame, type: .wechat)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class BiliVideoCell: VideoCell{
override init(frame: CGRect) {
//这里调用父类的时候,指定类型
super.init(frame: frame, type: .bilibili)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class TiktokVideoCell: VideoCell{
override init(frame: CGRect) {
//这里调用父类的时候,指定类型
super.init(frame: frame, type: .tiktok)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
完整demo地址
链接: https://pan.baidu.com/s/1bVkAb7EbPZonJGYm0JsOZA?pwd=gkbt 提取码: gkbt
gitee:
https://gitee.com/dosedo/init-collection-cell-demo.git
网友评论