在UICollectionView中滚动和选择时的奇怪行为

时间:2016-06-28 02:43:36

标签: ios swift

我在UICollectionView中的自定义单元格上显示复选标记时遇到问题。对于前几个水龙头,一切都按预期工作,但是当我开始重复滚动或点击或点击已经选择的单元格时,行为变得奇怪,如gif中所示。也许我会以不正确的方式解决这个问题? .addCheck()和.removeCheck()是我制作的自定义UICollectionViewCell类中的方法,他们所做的只是添加一个复选标记图像或从单元格视图中删除一个。 The odd behavior shown here

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

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! ColorUICollectionViewCell

    // Configure the cell
    let color = colorList[(indexPath as NSIndexPath).row]
    cell.delegate = self
    cell.textLabel.text = color.name
    cell.backgroundColor = color.color

    if color.selected {
        cell.addCheck()
    }
    else {
        cell.removeCheck()
    }

    return cell
}

// user selects item
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    // set colors to false for selection
    for color in colorList {
        color.selected = false
    }

    // set selected color to true for selection
    let color = colorList[indexPath.row]
    color.selected = true
    settings.backgroundColor = color.color
    //userDefaults.set(selectedIndex, forKey: "selectedIndex")
    collectionView.reloadData()
}

下面是我的自定义单元格中的addCheck()和removeCheck()函数的样子。

func addCheck() {
    // create check image
    let checkImage = UIImage(named: "checkmark")
    checkImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: bounds.size.height / 4, height: bounds.size.height / 4))
    checkImageView.image = checkImage!.withRenderingMode(UIImageRenderingMode.alwaysTemplate)
    checkImageView.tintColor = UIColor.white()

    // add the views
    addSubview(checkImageView)
}

func removeCheck() {
    if checkImageView != nil {
        checkImageView.removeFromSuperview()
    }
}

1 个答案:

答案 0 :(得分:1)

首先,您可以简化您的didSelect:

override func collectionView(collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    // set colors to false for selection
    for (index, color) in colorList.enumerate() {
        if index == indexPath.row {
            color.selected = false
            settings.backgroundColor = color.color
        }
        else {
            color.selected = false
        }
    }

    collectionView.reloadData()
}

根据您的cellForItemAt方法中的语言,当您点击同一个单元格两次时,我猜测您正在添加第二个复选标记图像,而且它没有被正确跟踪,因此单元格不断加速旋转,集合视图重新加载

发布您的单元格类,或者至少是addCheck和removeCheck的逻辑,我们可能会发现问题。

我建议永久使用带有复选标记的imageView,当根据选择显示/隐藏它时。这也应该加快collectionView的速度。