点击两次以突出显示集合视图中的复选标记

时间:2017-03-25 23:41:19

标签: ios swift swift3 uicollectionview

我有一个集合视图,你可以点击单元格来放大图像,然后点击放大的图像来消除它,在每个单元格上我也有一个可选的复选标记,以便您可以选择稍后下载所选图像。代码几乎与以下事实不同:有时我必须选择或取消选中两次复选标记。我真的不明白我的遗失,但这是我的代码:

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

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "photoCell", for: indexPath) as! PhotoCell
    let tap = UITapGestureRecognizer(target: self, action: #selector(checkmarkWasTapped(_ :)))

    cell.backgroundColor = .clear
    cell.imageView.image = UIImage(contentsOfFile: imagesURLArray[indexPath.row].path)
    cell.checkmarkView.checkMarkStyle = .GrayedOut
    cell.checkmarkView.tag = indexPath.row
    cell.checkmarkView.addGestureRecognizer(tap)

    return cell
}

func checkmarkWasTapped(_ sender: UIGestureRecognizer) {

    let checkmarkView = sender.view as! SSCheckMark
    let indexPath = IndexPath(row: checkmarkView.tag, section: 0)

    let imageURL = imagesURLArray[indexPath.row]

    if checkmarkView.checked == true {

        checkmarkView.checked = false
        selectedImagesArray.remove(at: selectedImagesArray.index(of: imageURL)!)
    } else {

        checkmarkView.checked = true
        selectedImagesArray.append(imageURL)
    }

    collectionView.reloadItems(at: [indexPath])
}

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

    addZoomedImage(indexPath.row)
    addGestureToImage()
    addBackGroundView()

    view.addSubview(selectedImage)
}

任何帮助都会很棒。感谢

1 个答案:

答案 0 :(得分:1)

我相信当你在集合视图上滚动时会出现问题,集合视图会重新加载每个单元格,而你却没有关于checkview最新状态的任何信息。

通常我存储一个bool数组(集合视图中元素数量的大小,你可以在加载你的模型后轻松创建)所以每次用户双击checkmark视图我改变采取集合视图单元格的索引并更改bool数组元素为true。

var boolArray = [Bool]()
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "photoCell", for: indexPath) as! PhotoCell
    let tap = UITapGestureRecognizer(target: self, action: #selector(checkmarkWasTapped(_ :)))

    cell.backgroundColor = .clear
    cell.imageView.image = UIImage(contentsOfFile: imagesURLArray[indexPath.row].path)

        if(boolArray[indexPath.row]){
            cell.checkmarkView.checked = false
        }
        else{
            cell.checkmarkView.checked = true
        }

    cell.checkmarkView.checkMarkStyle = .GrayedOut
    cell.checkmarkView.tag = indexPath.row
    cell.checkmarkView.addGestureRecognizer(tap)

    return cell
}

这可能是一个丑陋的解决方案,但我相信它会起作用。