user6393953
user6393953

Reputation:

UIPageControl to show current page

I made a PageViewController to switch between different View Controllers, and i'd like to show which page we see. I added a pageControl, and gave it the following code.

pageControl.currentPageIndicatorTintColor = UIColor.blueColor()
pageControl.pageIndicatorTintColor = UIColor.lightGrayColor()
pageControl.numberOfPages = pages.count

The complete code:

import UIKit

class ViewControllerSportinfrastructuur: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {

@IBOutlet weak var pageControl: UIPageControl!

var pageViewController: UIPageViewController!
let pages = ["PageOneViewController", "PageTwoViewController"]

//MARK: - page view controller data source
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {

    if let index = pages.indexOf(viewController.restorationIdentifier!) {
        if index > 0 {
            return viewControllerAtIndex(index - 1)
        }
    }

    return nil
}

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {

    if let index = pages.indexOf(viewController.restorationIdentifier!) {
        if index < pages.count - 1 {
            return viewControllerAtIndex(index + 1)
        }
    }
    return nil
}

func viewControllerAtIndex(index: Int) -> UIViewController? {
    let vc = storyboard?.instantiateViewControllerWithIdentifier(pages[index])
    return vc
}

override func viewDidLoad() {
    super.viewDidLoad()

    if let vc = storyboard?.instantiateViewControllerWithIdentifier("MyPageViewController") {
        self.addChildViewController(vc)
        self.view.addSubview(vc.view)

        pageViewController = vc as! UIPageViewController
        pageViewController.dataSource = self
        pageViewController.delegate = self
        pageViewController.setViewControllers([viewControllerAtIndex(0)!], direction: .Forward, animated: true, completion: nil)
        pageViewController.didMoveToParentViewController(self)

        pageControl.currentPageIndicatorTintColor = UIColor.blueColor()
        pageControl.pageIndicatorTintColor = UIColor.lightGrayColor()
        pageControl.numberOfPages = pages.count
    }
}

Does anyone know what code i should use to set up the current page? Thanks in advance!

Upvotes: 3

Views: 6184

Answers (3)

tanz
tanz

Reputation: 2547

The UIPageViewController provides a default UIPageControl - I would recommend to make use of it if you don't have particular custom requirements.

In order to show it you need to implement the following two optional methods in your UIPageViewControllerDataSource:

func presentationCount(for pageViewController: UIPageViewController) -> Int {
    return n //number of view controllers
}

func presentationIndex(for pageViewController: UIPageViewController) -> Int {
    return i //index of the visible view controller
}

Upvotes: 0

user6393953
user6393953

Reputation:

EDIT: found the answer already!

I added pageControl.currentPage = index in following functions:

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {

    if let index = pages.indexOf(viewController.restorationIdentifier!) {
        pageControl.currentPage = index
        if index > 0 {
            return viewControllerAtIndex(index - 1)
        }
    }

    return nil
}

And did the same for the viewControllerAfterViewController func!

Upvotes: 6

Konstantin
Konstantin

Reputation: 861

Set pageViewController.delegate = self, implement protocol UIPageViewControllerDelegate

and use on of these methods to set self.pageControl.currentPage = ...

optional func pageViewController(_ pageViewController: UIPageViewController,
 willTransitionToViewControllers pendingViewControllers: [UIViewController])

optional func pageViewController(_ pageViewController: UIPageViewController,
              didFinishAnimating finished: Bool,
         previousViewControllers previousViewControllers: [UIViewController],
             transitionCompleted completed: Bool)

Upvotes: -1

Related Questions