0

I enabled paging on my collectionview and encountered the first issue of each swipe not stopping on a different cell, but page.

I then tried to enter code and handle the paging manually in ScrollViewWillEndDecelerating. However my problem is the changing the collectionviews ContentOffset or scrolling to a Point both do not work unless called in LayoutSubiews. that is the only place where they effect the CollectionView

Each cell in my collection view is full screen. I handle the cell sizing in layout subviews.

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    if let layout = customCollectionView.collectionViewLayout as? UICollectionViewFlowLayout {
        let itemWidth = view.frame.width
        let itemHeight = view.frame.height
        layout.itemSize = CGSize(width: itemWidth, height: itemHeight)
        layout.invalidateLayout()
    }


    let ip = IndexPath(row: 2, section: 0)

    view.layoutIfNeeded()
    customCollectionView.scrollToItem(at: ip, at: UICollectionViewScrollPosition.centeredVertically, animated: true)

    let point = CGPoint(x: 50, y: 600)
    customCollectionView.setContentOffset(point, animated: true)

}


func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {

    let pageHeight = customCollectionView.bounds.size.height
    let videoLength = CGFloat(videoArray.count)

    let minSpace:CGFloat = 10

    var cellToSwipe = (scrollView.contentOffset.y) / (pageHeight + minSpace) + 0.5
    if cellToSwipe < 0 {
        cellToSwipe = 0
    }
    else if (cellToSwipe >= videoLength){
        cellToSwipe = videoLength - 1
    }
    let p = Int(cellToSwipe)
    let roundedIP = round(Double(Int(cellToSwipe)))
    let ip = IndexPath(row: Int(roundedIP), section: 0)

   let ip = IndexPath(row: 2, section: 0)
    view.layoutIfNeeded()
    customCollectionView.scrollToItem(at: ip, at: UICollectionViewScrollPosition.centeredVertically, animated: true)


}
mparrish91
  • 101
  • 3
  • 11

1 Answers1

5

First off, I would recommend making your view controller class conform to UICollectionViewDelegateFlowLayout and use the following delegate method to size your UICollectionViewCells

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let size = CGSize(width: view.frame.width, height: view.frame.height)
    return size
}

Then in your viewDidLoad call

customCollectionView.isPagingEnabled = true
Eli Whittle
  • 1,084
  • 1
  • 15
  • 19