0

제스처를 처음 사용하고 있습니다. 제 접근법이 잘못되었거나 더 나은 해결책이 있다면 알려주십시오.콜렉션 뷰 재설정 탭 동작시 셀 위치

스 와이프 할 때 collectionView 셀을 삭제하려고합니다. UITableview 삭제 기능과 마찬가지로 왼쪽으로 이동합니다. 삭제가 정상적으로 작동합니다. 내가있는 viewDidLoad 및 이 코드 업데이트를 시도/사용하고

(동일있는 tableview 같은 행 삭제 기능) 셀을 슬쩍하고 다시 원래의 위치로 슬쩍해야 COllectionView의 아무 곳이나 탭하면 이제 내가 원하는이며, 나는 self.collectionView.performBatchUpdates하지만하지 부드러운 애니메이션으로 다시 원래 셀의 위치를 ​​설정 할 수 있어요 그래서 여기에 이벤트

override func viewDidLoad() { 
super.viewDidLoad() 

     let tap = UITapGestureRecognizer(target: self, action: #selector(tapped(_:))) 
     self.view.addGestureRecognizer(tap) 
} 

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

let Cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell", for: indexPath) as! CustomCell 
    Cell.backgroundColor = UIColor.white 

    let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(delete(sender:))) 
    leftSwipe.direction = UISwipeGestureRecognizerDirection.left 
    Cell.addGestureRecognizer(leftSwipe) 

    let tap = UITapGestureRecognizer(target: self, action: #selector(tapped(_:))) 
    Cell.addGestureRecognizer(tap) 

    Cell.deleteButton.addTarget(self, action: #selector(DeleteCell(sender:)), for: .touchUpInside) 
} 

func tapped(_ recognizer: UITapGestureRecognizer) { 
    // self.collectionView.performBatchUpdates({ 
     //self.collectionView.reloadSections(NSIndexSet(index: 0) as IndexSet) 
    //}, completion: nil) 


    let point = recognizer.location(in: collectionView) 
    let indexPath = collectionView.indexPathForItem(at: point)   
    let cell = self.collectionView.cellForItem(at: indexPath!) 

    UIView.animate(withDuration: 0.4) { 

     cell?.contentView.frame = CGRect(x: 0, y: 0, width: (cell?.contentView.frame.width)!, height: (cell?.contentView.frame.height)!) 
    } 

} 

func delete(sender: UISwipeGestureRecognizer){ 

    let cell = sender.view as! CustomCell 

    UIView.animate(withDuration: 0.4) { 
     cell.contentView.frame = CGRect(x: -90, y: 0, width: cell.contentView.frame.width, height: cell.contentView.frame.height) 
    } 
} 

func DeleteCell(sender : AnyObject){ 

    let cell = sender.superview as! CustomCell 
    let i = self.collectionView.indexPath(for: cell)!.item 

    let indexpath = self.collectionView.indexPath(for: cell) 
    let array : NSMutableArray = [] 

    self.collectionView.performBatchUpdates({ 

     self.userArray.remove(at: i) 

     array.add(indexpath!) 

     self.collectionView.deleteItems(at:array as! [IndexPath]) 

    }, completion: nil) 
} 


class CustomCell: UICollectionViewCell { 
    let deleteButton: UIButton = { 
    let deleteBtn = UIButton() 
    deleteBtn.setImage(UIImage(named: "red"), for: .normal) 
    deleteBtn.contentMode = .scaleAspectFit 
    return deleteBtn 
    }() 
} 

을 도청. 사용하려고 시도했습니다. 다른 셀이나 다른 셀이 아닌 다른 셀을 스 와이프 한 셀만 스 와이프 한 경우에만 작동합니다. 어떤 제안이 도움이 될 것입니다 !!

답변

0

마지막으로 해결책을 얻으십시오.

CollectionViewSlideLeft 그것이 나 같은 사람을 도움이 될 것입니다 희망 - 여기

내가 볼 수있는 데모 프로젝트입니다. :)

0

지금은 자체에서 셀에 액세스하고 있습니다. 방금 스 와이프 한 셀을 탭하는 이유는 그 특정 인스턴스가 UITapGestureRecognizer 인 유일한 셀이기 때문입니다. 이 문제를 해결하려면 해당 탭 제스처 인식기를 전체보기에 추가해야합니다. viewDidLoad() 방법에 다음을 추가하십시오.

let tap = UITapGestureRecognizer(target: self, action: #selector(tapped(_:))) 
self.view.addGestureRecognizer(tap) 
+0

감사합니다 jacolack! 나는 그것을 시도하고 동일하다. 선택한 셀을 탭한 경우에만 셀이 돌아갑니다. – iUser

+0

어느 클래스에 추가 하시겠습니까? – Jacolack

+0

안녕하세요. 죄송하지만 어떤 수업을 듣지 않으셨습니까? 위의 코드를 업데이트했습니다. 좀 봐주세요. – iUser