如何防止出队的集合视图单元格相互重叠?

Posted

技术标签:

【中文标题】如何防止出队的集合视图单元格相互重叠?【英文标题】:How to prevent dequeued collection view cells from overlapping each other? 【发布时间】:2017-07-16 06:14:28 【问题描述】:

我一直在尝试设置一个集合视图,让用户在其中提交几个字符串,我将这些字符串放入一个数组中,然后通过集合视图的 cellForItemAt 函数回调。但是,每当我在集合视图的顶部添加一行时,它都会在最后一个单元格标签的顶部添加单元格标签,因此 they stack like this。请注意我添加的每个新词如何在渲染中包含所有其他先前的词。

我在 cellForItemAt 的代码是

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

    if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "InterestsCell", for: indexPath) as? InterestsCell 
        cell.interestLabel.text = array[indexPath.row]
        return cell
     else 
        return UICollectionViewCell()
    

按下添加按钮时我的代码是

func addTapped() 
    let interest = interestsField.text
    array.insert(interest!, at: 0)
    interestsField.text = ""

    collectionView.reloadData()

我不确定发生了什么。我到处寻找并尝试使用 prepareForReuse() 但它似乎没有用。后来我尝试通过调用 didSelect 来删除单元格,并且单元格不会再次消失。任何帮助表示赞赏!

This is the code I have in my custom collection view cell implementation in the event that this is causing the error

【问题讨论】:

我建议使用视图调试器来确定问题所在(例如重叠标签、重叠单元格或重叠集合视图)。您知道视图层次结构是什么样的,这将缩小您的研究范围。 @Rob 谢谢 Rob,这让我走上了正轨。出于某种原因,每次我添加一个新字符串时它都会创建一个集合视图的新实例,因此它将每个集合堆叠在一起。 是的,现在您可以追踪添加重复集合视图的位置。但到目前为止,它不在您与我们共享的代码中。祝你好运! 我投票结束这个问题,因为这个问题不包含重现问题所需的代码 【参考方案1】:

为此,将这些函数粘贴到您的项目中

   func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat 
    return 1


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat 
    return 1

你可以玩弄这些值:)

【讨论】:

【参考方案2】:

这可以使用 UITableView 轻松实现。所以尝试使用 UITableView 而不是 UICollectionView。

【讨论】:

【参考方案3】:

看起来您每次设置文本时都会添加一个新标签。如果你想懒加载 UILabel 你需要添加lazy

lazy var interestLabel: UILabel = 
  ...
()

不过我不会这样做,我会创建对标签的引用

weak var interestLabel: UILabel!

然后在你的 setupViews 方法中添加标签

func setupViews() 
    ...
    let interestLabel = UILabel()
    ...
    contentView.addSubview(interestLabel)
    self.interestLabel = interestLabel

【讨论】:

以上是关于如何防止出队的集合视图单元格相互重叠?的主要内容,如果未能解决你的问题,请参考以下文章

动态/可出队的 UITableviewcells 内的 UITextfield

使用出队的 dequeueReusableCell - 出队后单元格的 textField

出队的 UICollectionViewCell 未刷新

如何防止最后一个表格单元格与键盘重叠

CollectionView 与单元格重叠

集合视图单元格上的重叠阴影