2017-03-25 1 views
-1

셀을 탭하여 이미지를 확대하고 확대 된 이미지를 탭하면 각 셀에 선택 표시가 있으므로 컬렉션을 선택할 수 있습니다. 나중에 선택한 이미지를 다운로드하십시오. 코드는 때로는 체크 표시를 두 번 선택하거나 선택을 해제해야한다는 사실을 제외하고 거의 작동합니다. 나는 실종 된 것을 정말로 이해하지 못한다.하지만 내 코드는 다음과 같다.두 번 가볍게 두드리면 컬렉션보기의 체크 표시가 강조 표시됩니다.

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

컬렉션보기에서 스크롤 할 때 컬렉션보기가 모든 셀을 다시로드하고 checkview의 최신 상태에 대한 정보가 없을 때 문제가 있다고 생각합니다.

보통 사용자가 체크 표시를 두 번 탭할 때마다 콜렉션 뷰 셀의 인덱스를 가져 와서 변경할 때마다 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 
} 

추악한 해결책 일 수 있지만 제대로 작동 할 것입니다.

+0

안녕하세요. 답장을 보내 주셔서 감사합니다. if 문은 각 리로드에서 선택 항목을 바꿀 필요가 없습니까? if (boolArray [indexPath.row]) {' – Wazza

+0

boolArray [indexPath.row]가 false가되기 전에 사용자가 셀을 북마크하지 않았 으면 셀로드시 checkmarkView가 선택 취소됩니다. 그렇지 않으면 확인 될거야. checkmarkView가 그렇게 작동한다면? –

+0

viewdidload에서 bool 배열을 false로 채우고 'if! (boolArray [indexPath.row]) '를 사용하면 모두 체크가 해제되어 있지만 check를 선택하면 즉시 체크가 해제됩니다. if if (boolArray [indexPath.row])'그러면 그것들은 모두 검사되고 내가 그들을 선택할 때 아무 일도 일어나지 않습니다. – Wazza