UICollection 单元格快速混合

Posted

技术标签:

【中文标题】UICollection 单元格快速混合【英文标题】:UICollection Cells are mixed in swift 【发布时间】:2019-10-01 12:25:21 【问题描述】:

我正在尝试生成单元格并将标签放入其中。但是,当我向下滚动时,标签会在单元格之间混合。这是我的代码,我正在尝试解决它。

    let lblTitle = UILabel()
    let lblMetro = UILabel()
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

    var cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MenuCell", for: indexPath) as? UICustomCollectionViewCell

        if indexPath.row == 0 
            lblTitle.frame = CGRect(x: 0, y: 0, width: 195, height: 40)
            lblTitle.font = UIFont.systemFont(ofSize: 14)
            lblTitle.textColor = UIColor.white
            lblTitle.backgroundColor =  colorLiteral(red: 0.2122299671, green: 0.4379466176, blue: 0.8993332386, alpha: 1)
            lblTitle.text = "  1”
            cell?.contentView.addSubview(lblTitle)
            

                if indexPath.row == 1 
           lblMetro.frame = CGRect(x: 55, y: 290, width: 100, height: 20)
            lblMetro.font = UIFont.boldSystemFont(ofSize: 17)
            lblMetro.textColor =  colorLiteral(red: 0, green: 0.3117707968, blue: 0.5609284043, alpha: 1)
            lblMetro.text = “2”
            cell?.contentView.addSubview(lblMetro)
            

    return cell ?? UICollectionViewCell()
    
 

【问题讨论】:

cell?.contentView.addSubview(lblMetro)。不。细胞被重复使用。另外,为什么你有一个属性let lblMetro = UILabel() 放在单元格上?不。在UICustomCollectionViewCell 中,添加一个标签变量。并使用它。 【参考方案1】:

这里的单元格出队了

var cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MenuCell", for: indexPath) as? UICustomCollectionViewCell

所以你可能会得到一个带有先前添加标签的 1 ,你需要在 dequeue 之后清除它们,这会很混乱,但最好将 vc 的标签与单元格 1 隔离开,以便将它们添加到单元格配置中或使它们成为出口, 删除给他们一个标签并在上面的行之后做

cell.contentView.subviews.forEach  
   if $0.tag == 200 
      $0.removeFromSuperview()
   

【讨论】:

【参考方案2】:

未优化,但这可能会解决它,在添加之前从父视图中删除子视图:

cell?.contentView.lblTitle.removeFromSuperview()
cell?.contentView.addSubview(lblTitle)

还有:

cell?.contentView.lblMetro.removeFromSuperview()
cell?.contentView.addSubview(lblMetro)

【讨论】:

cell的contentView如何引用自定义标签lblMetro和lblTitle?【参考方案3】:

我建议使用很少使用的方法UICollectionViewCellUITableViewCell prepareForReuse。 在UICustomCollectionViewCell的定义中插入函数:

class UICustomCollectionViewCell: UICollectionViewCell 
    func prepareForReuse() 
        // This method is immediately called when a cell is about to be dequeued.
        super.prepareForReuse()
        if let view = contentView.viewWithTag(100) 
            view.removeFromSuperView()
        

        if let view = contentView.viewWithTag(101) 
            view.removeFromSuperView()
        
    

然后给标签打标签

lblMetro.tag = 100
lblTitle.tag = 101

如果您只使用有限的标签和单元格,此解决方案是有效的。对于更通用的方法,动态创建标签并共享标签。在 prepareForReuse() 中,只需删除带有该标签的子视图。

【讨论】:

以上是关于UICollection 单元格快速混合的主要内容,如果未能解决你的问题,请参考以下文章

从集合 1 更新集合中的单元格内容

理解 UICollection Flow Layout 流式布局

UICollection NumberOfItemsInSection 向 vars 添加常量的问题

识别 CollectionView 中的单元格

Collectionview 图像单元格滚动问题

如何同步单元格动画