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】:我建议使用很少使用的方法UICollectionViewCell
或UITableViewCell
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 单元格快速混合的主要内容,如果未能解决你的问题,请参考以下文章
理解 UICollection Flow Layout 流式布局