Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the index path of a UICollectionView header?

Using the view's indexPathForItemAtPoint, I will get an index path for a cell, but never a UICollectionReusableView (header/footer) -- as it always returns nil.

like image 223
akaru Avatar asked Feb 27 '13 05:02

akaru


3 Answers

You should make your own dictionary mapping index paths to header views. In your collectionView:viewForSupplementaryElementOfKind:atIndexPath: method, put the view into the dictionary before returning it. In your collectionView:didEndDisplayingSupplementaryView:forElementOfKind:atIndexPath:, remove the view from the dictionary.

like image 64
Vineet Singh Avatar answered Sep 29 '22 03:09

Vineet Singh


override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    switch kind {
    case UICollectionElementKindSectionHeader:
        let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "header", for: indexPath) as! HeaderCollectionReusableView
        let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didSelectSection(gesture:)))
        headerView.addGestureRecognizer(gestureRecognizer)
        return headerView
    }
}

Now in didSelectSection :

func didSelectSection(gesture: UITapGestureRecognizer) {
    let indexPaths = self.collectionView?.indexPathsForVisibleSupplementaryElements(ofKind: UICollectionElementKindSectionHeader)
    for indexPath in indexPaths! {
        if (gesture.view as! HeaderCollectionReusableView) == collectionView?.supplementaryView(forElementKind: UICollectionElementKindSectionHeader, at: indexPath){
            print("found at : \(indexPath)")
            break
        }
    }
}
like image 23
jovanpreet Avatar answered Nov 16 '22 22:11

jovanpreet


You can add extension for UICollectionView where pass reference of supplementary view and kind of this view (UICollectionView.elementKindSectionHeader or UICollectionView.elementKindSectionFooter)

extension UICollectionView {
    
    func indexPathForSupplementaryElement(_ supplementaryView: UICollectionReusableView, ofKind kind: String) -> IndexPath? {
        let visibleIndexPaths = self.indexPathsForVisibleSupplementaryElements(ofKind: kind)
        return visibleIndexPaths.first(where: {
            self.supplementaryView(forElementKind: kind, at: $0) == supplementaryView
        })
    }
    
}

This method doesn't work if supplementary view isn't visible!

like image 1
Yurii Lysytsia Avatar answered Nov 16 '22 22:11

Yurii Lysytsia