UICollectionView의 중앙에 위치하고 싶은 Cell의 IndexPath 값을 가져와야 되는 상황이 있다.

예를 들어 컨텐츠가 비디오인 리스트에서 중앙에 위치한 비디오 셀을 알아내서 플레이를 시켜야 되는 상황같은???

유튜브 리스트 스크롤 하다보면 자동으로 리스트에서 한개의 비디오가 재생되는 것을 봤을 것이다.

 

extension UICollectionView {
	/**
     UICollectionView Visible 상태의  Cell 의 indexPath 값 호출
     
     - Returns: IndexPath?
     
     # Example #
     ```
     let indexPath = collectionView.indexPathForVisibleCenter()
     ```
     */
    func indexPathForVisibleCenter() -> IndexPath? {
        
        var visibleRect = CGRect()
        visibleRect.origin = self.contentOffset
        visibleRect.size = self.bounds.size
        
        let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY - 200.0)
        // let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
        // let visiblePoint = CGPoint(x: self.center.x + self.contentOffset.x,y: self.center.y + self.contentOffset.y)
        return self.indexPathForItem(at: visiblePoint)
    }
}

 

사용방법

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in
	// 현재 보여지고 있는 중앙에 있는 셀의 indexPath를 구해온다.
	if let indexPath = self?.collectionView?.indexPathForVisibleCenter() {
    	// 구해온 indexPath로 셀 정보를 가져온다.
    	if let cell = self?.collectionView?.cellForItem(at: indexPath) as? VideoCell {
        	cell.play()
        }
    }

 

+ Recent posts