iosswiftuicollectionviewuiscrollviewuiscrollviewdelegate

Preventing UICollectionView from scrolling outside of contentOffset


I created a collectionView with 4 cells, the cell frames are equal to the entire window frame so that I can scroll through them as they were a PageViewController.

lazy var collectionView : PagesCollectionView = {
  let layout = UICollectionViewFlowLayout()
   layout.scrollDirection = .horizontal
  layout.minimumLineSpacing = 0
    let collectionView = PagesCollectionView(frame: .zero, collectionViewLayout: layout)
    collectionView.delegate = self
    collectionView.dataSource = self
    collectionView.isPagingEnabled = true
    collectionView.alwaysBounceHorizontal = false

    return collectionView
}()

The goal I want to accomplish is that when I am in the first cell and scroll on the left (contentOffset negative) the collectionView scrolling stops, and when I am on the last cell the collectionView stops scrolling in the right direction, I want to see the cell still.

I tried different procedures: This one blocked the scrollView only after having scrolled it in the first place, never re-enabling the scrolling in the other direction:

 func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if(scrollView.contentOffset.x == 0){
        scrollView.isScrollEnabled = false
    }

}

As suggested on other StackOverflow topics:

  func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        if(scrollView.contentOffset.x == 0){
            collectionView.isScrollEnabled = false

        }

        collectionView.isScrollEnabled = true

    }

But this just blocks the scrolling in both directions. I actually don't know how to solve this.


Solution

  • I actually figured out how to solve this problem, it's really easy.

    In my viewDidLoad method where I set the collectionView I set bounces equal to false:

     collectionView.bounces = false