How to make uipageviewcontroller in circles

I have a UIPageViewController that shows different pages. The current behavior is that it stops scrolling when I get to the last page. What I want to achieve right now is that on the last page and scrolling to the right, it goes to the first page. When on the first page, go to the last page while scrolling to the left. So basically let the PageViewController show the pages in circles. My first approach works pretty well, having more than one page or starting from one separate page:

- (UIViewController*) pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(TMCollectionViewController *)viewController { if((viewController.pageIndex) >= 1) { return _viewControllers[viewController.pageIndex - 1]; } else { if ([_viewControllers count] == 1) { return nil; } return [_viewControllers objectAtIndex:[_viewControllers count]-1]; } } 

But when I delete pages so that there is only one left, it still remembers the page before or after and displays it accordingly. Although there is only one page left in the array. Any help is much appreciated.

+8
ios objective-c swift uipageviewcontroller
source share
3 answers

You can implement it as

When you are on the first index and swipe left, make its index = total number of pages

 - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { NSUInteger index = ((PageContentViewController*) viewController).pageIndex; if ((index == 0) || (index == NSNotFound)) { index = self.pageTitles.count; } index--; return [_viewControllers objectAtIndex:index]; } 

When you are at the last index, set it to zero index

 - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { NSUInteger index = ((PageContentViewController*) viewController).pageIndex; if (index == NSNotFound) { return nil; } index++; if (index == [self.pageTitles count]) { index = 0; } return [_viewControllers objectAtIndex:index]; } 
+12
source share

Thanks @Roshni

Swift 2 - Roshni's solution

 func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { var index: Int = (viewController as! PageContentViewController).index if index == 0 || index == NSNotFound { index = self.pageTitles.count } index-- return viewControllerAtIndex(index) } func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { var index: Int = (viewController as! PageContentViewController).index if index == NSNotFound { return nil } index++ if index == self.pageTitles.count { index = 0 } return viewControllerAtIndex(index) } 
+2
source share

here is a sample i made for pagination

I used the UIPageViewController to create a content slider (Objective-C / Swift) , but thanks to @Tom Calmon and @Roshani I can now achieve the desired result on Swift 2.2

 class PageHomeViewController: UIViewController , UIPageViewControllerDataSource{ // MARK: - Variables private var pageViewController: UIPageViewController? // Initialize it right away here private let contentImages = ["nature_pic_1.png", "nature_pic_2.png", "nature_pic_3.png", "nature_pic_4.png"]; //MARK: - View controller life cycle methods override func viewDidLoad() { super.viewDidLoad() createPageViewController() setupPageControl() } //MARK: - Create and start page view controller private func createPageViewController() { let pageController = self.storyboard!.instantiateViewControllerWithIdentifier("PageViewController") as! UIPageViewController pageController.dataSource = self if contentImages.count > 0 { let firstController = getItemController(0)! let startingViewControllers: NSArray = [firstController] pageController.setViewControllers(startingViewControllers as? [UIViewController], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil) } pageViewController = pageController addChildViewController(pageViewController!) self.view.addSubview(pageViewController!.view) pageViewController!.didMoveToParentViewController(self) } private func setupPageControl() { let appearance = UIPageControl.appearance() appearance.pageIndicatorTintColor = UIColor.grayColor() appearance.currentPageIndicatorTintColor = UIColor.whiteColor() appearance.backgroundColor = UIColor.darkGrayColor() } // MARK: - UIPageViewControllerDataSource func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { var index: Int = (viewController as! PageContentViewController).itemIndex if index == 0 || index == NSNotFound { index = contentImages.count } index -= 1 return getItemController(index) } func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController?{ var index: Int = (viewController as! PageContentViewController).itemIndex if index == NSNotFound {return nil} index += 1 if index == contentImages.count {index = 0} return getItemController(index) } private func getItemController(itemIndex: Int) -> PageContentViewController? { if itemIndex < contentImages.count { let pageItemController = self.storyboard!.instantiateViewControllerWithIdentifier("PageContentViewController") as! PageContentViewController pageItemController.itemIndex = itemIndex pageItemController.imageName = contentImages[itemIndex] return pageItemController } return nil } // MARK: - Page Indicator func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int { return contentImages.count } func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { return 0 } } 

enter image description here

Hope this helps someone someday !!

+1
source share

All Articles