How to connect UIPageControl to UICollectionView (Swift) How to connect UIPageControl to UICollectionView (Swift) ios ios

How to connect UIPageControl to UICollectionView (Swift)


Firstly add your UIPageControl into your storyboard with your UICollectionView, then connect them as outlets to your view controller.

@IBOutlet var pageControl: UIPageControl!@IBOutlet var collectionView: UICollectionView!

Adjust your numberOfItemsInSection method in UICollectionViewDataSource to set the count of the page control to always be equal to the number of cells in the collection view.

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {    let count = ...    pageControl.numberOfPages = count    pageControl.isHidden = !(count > 1)    return count}

Lastly, using the UIScrollViewDelegate, we can tell which cell the UICollectionView stops on. If you are not using a UICollectionViewController, you may have to add the delegate protocol.

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {    pageControl?.currentPage = Int(scrollView.contentOffset.x) / Int(scrollView.frame.width)}func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {    pageControl?.currentPage = Int(scrollView.contentOffset.x) / Int(scrollView.frame.width)}

This is possible because a UICollectionView is in fact a UIScrollView under the hood.


Step 1 Create the variables for Collection View and Page Control

@IBOutlet weak var collectionView: UICollectionView!@IBOutlet var pageControl:UIPageControl!     

Step 2 Set the number of pages of Page Control

override func viewDidLoad() {    super.viewDidLoad()             self.pageControl.numberOfPages = procedures.count    //Set the delegate    self.collectionView.delegate = self}

*Step 3 In the scrollViewDidScroll function calculate the width of collection cell and the index for the current page.

    extension YourCollectionVC: UICollectionViewDataSource, UICollectionViewDelegate {            override func scrollViewDidScroll(_ scrollView: UIScrollView) {                let witdh = scrollView.frame.width - (scrollView.contentInset.left*2)                let index = scrollView.contentOffset.x / witdh                let roundedIndex = round(index)                self.pageControl?.currentPage = Int(roundedIndex)            }}

Note: This is for collection view displayed horizontally, for vertical direccion change the method.

Tested in swift 4.


Use this for smooth functioning.

 func scrollViewDidScroll(_ scrollView: UIScrollView) {    let witdh = scrollView.frame.width - (scrollView.contentInset.left*2)    let index = scrollView.contentOffset.x / witdh    let roundedIndex = round(index)    self.pageControl.currentPage = Int(roundedIndex)}func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {    pageControl.currentPage = Int(scrollView.contentOffset.x) / Int(scrollView.frame.width)}func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {    pageControl.currentPage = Int(scrollView.contentOffset.x) / Int(scrollView.frame.width)}