美文网首页
UICollectionViewCell init初始化传参数实

UICollectionViewCell init初始化传参数实

作者: 生命不止运动不息 | 来源:发表于2022-06-01 13:20 被阅读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

    相关文章

      网友评论

          本文标题:UICollectionViewCell init初始化传参数实

          本文链接:https://www.haomeiwen.com/subject/jbjxmrtx.html