UICollectionViewCell init初始化传参数实

2022-06-01  本文已影响0人  生命不止运动不息

问题: 想在初始化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

上一篇下一篇

猜你喜欢

热点阅读