Platformsios 9.0, tvos 10.0, requires ARC








TL;DR UIPageViewController done properly.

Pageboy is a simple, highly informative page view controller.

⭐️ Features

  • [x] Simplified data source management.
  • [x] Enhanced delegation; featuring exact relative positional data and reliable updates.
  • [x] Infinite scrolling support.
  • [x] Automatic timer-based page transitioning.
  • [x] Support for custom page transitions.

📋 Requirements

Pageboy requires iOS 9 / tvOS 10 or above; and is written in Swift 4.

📲 Installation


Pageboy is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod 'Pageboy', '~> 2.0'

And run pod install.


Pageboy is available through Carthage. Simply install carthage with Homebrew using the following command:

$ brew update
$ brew install carthage

Add Pageboy to your Cartfile:

github "uias/Pageboy" ~> 2.0

🚀 Usage

Getting Started

1) Create an instance of a PageboyViewController and provide it with a PageboyViewControllerDataSource.

class PageViewController: PageboyViewController, PageboyViewControllerDataSource {

    override func viewDidLoad() {

    self.dataSource = self

2) Implement the PageboyViewControllerDataSource functions.

func numberOfViewControllers(in pageboyViewController: PageboyViewController) -> Int {
    return viewControllers.count

func viewController(for pageboyViewController: PageboyViewController,
                    at index: PageboyViewController.PageIndex) -> UIViewController? {
    return viewControllers[index]

func defaultPage(for pageboyViewController: PageboyViewController) -> PageboyViewController.Page? {
    return nil

3) Enjoy.


Unfortunately, UIPageViewController doesn’t provide the most useful delegate methods for detecting positional data. PageboyViewControllerDelegate provides a number of functions for being able to detect where the page view controller is, and where it’s headed.


The page view controller is about to embark on a transition to a new page.

func pageboyViewController(_ pageboyViewController: PageboyViewController,
                           willScrollToPageAt index: Int,
                           direction: PageboyViewController.NavigationDirection,
                           animated: Bool)


The page view controller was scrolled to a relative position along the way transitioning to a new page. Also provided is the direction of the transition.

func pageboyViewController(_ pageboyViewController: PageboyViewController,
                           didScrollTo position: CGPoint,
                           direction: PageboyViewController.NavigationDirection,
                           animated: Bool)


The page view controller has successfully completed a scroll transition to a page.

func pageboyViewController(_ pageboyViewController: PageboyViewController,
                           didScrollToPageAt index: Int,
                           direction: PageboyViewController.NavigationDirection,
                           animated: Bool)


The page view controller has reloaded its child view controllers.

func pageboyViewController(_ pageboyViewController: PageboyViewController,
                           didReloadWith currentViewController: UIViewController,
                           currentPageIndex: PageboyViewController.PageIndex)

⚡️ Extras

  • reloadPages() – Reload the view controllers in the page view controller. (Refreshes the data source).
  • scrollToPage() – Scroll the page view controller to a new page programatically.

    public func scrollToPage(_ pageIndex: PageIndex,
                               animated: Bool,
                               completion: PageTransitionCompletion? = nil)
  • .navigationOrientation – Whether to orientate the pages horizontally or vertically.
  • .isScrollEnabled – Whether or not scrolling is allowed on the page view controller.
  • .isInfiniteScrollEnabled – Whether the page view controller should infinitely scroll at the end of page ranges.
  • .currentViewController – The currently visible view controller if it exists.
  • .currentPosition – The exact current relative position of the page view controller.
  • .currentIndex – The index of the currently visible page.
  • .showsPageControl – Whether to show the built-in page control.
  • .parentPageboy – Access the parent PageboyViewController from any child UIViewController.

    class ChildViewController: UIViewController {
        func doSomething() {
            parentPageboy?.scrollToPage(.next, animated: true)


Pageboy also provides custom animated transition support. This can be customised via the .transition property on PageboyViewController.

pageboyViewController.transition = Transition(style: .push, duration: 1.0)

The following styles are available:

  • .push
  • .fade
  • .moveIn
  • .reveal

Note: By default this is set to nil, which uses the standard animation provided by UIPageViewController.

Auto Scrolling

PageboyAutoScroller is available to set up timer based automatic scrolling of the PageboyViewController:


Support for custom intermission duration and other scroll behaviors is also available.

👨🏻‍💻 About

❤️ Contributing

Bug reports and pull requests are welcome on GitHub at

👮🏻‍♂️ License

The library is available as open source under the terms of the MIT License.

Latest podspec

    "name": "JBDPageboy",
    "platforms": {
        "ios": "9.0",
        "tvos": "10.0"
    "swift_version": "4.0",
    "requires_arc": true,
    "version": "2.5.2",
    "summary": "A simple, highly informative page view controller.",
    "description": "A page view controller that provides simplified data source management, enhanced delegation and other useful features.",
    "homepage": "",
    "license": "MIT",
    "authors": {
        "Merrick Sapsford": "[email protected]"
    "social_media_url": "",
    "source": {
        "git": "",
        "tag": "2.5.2"
    "source_files": "Sources/Pageboy/**/*.{h,m,swift}"

Pin It on Pinterest

Share This