LettersBa
LettersBa

Reputation: 767

How to remove infinite scroll on UIPageViewController?

I have two storyboards with identifiers "one" and "two", I have a UIPageViewController and a subclass of it. In the subclass I have this code below:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.dataSource = self;
    self.delegate = self;
    counter = 0;

    [self setViewControllers:@[[self.storyboard instantiateViewControllerWithIdentifier:@"one"]] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{

    if ([viewController isKindOfClass:[ViewController class]]){
    return [self.storyboard instantiateViewControllerWithIdentifier:@"one"];
    }

    return nil;


}


- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{

    if ([viewController isKindOfClass:[secondViewController class]]){
    return [self.storyboard instantiateViewControllerWithIdentifier:@"two"];
    }

    return nil;

}

This code works very well, but has a problem! The scroll is infinite; in my case I need to take off the infinite scroll. How I can do this?

First thing is create a counter and do checks inside my methods:

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{

    if (counter < 1) {
        NSLog(@"Don't get back");
        return nil;
    }

    ......

}


- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{

    if (counter >= 1) {
        NSLog(@"Don't go anymore");
        return nil;
    }

    ....
}

The second thing is try to use counter++ and counter--. This is being a big puzzle to me, anyone have any better ideas?

Upvotes: 0

Views: 1160

Answers (2)

Cian
Cian

Reputation: 263

Just a little change in the condition.

 - (nullable UIViewController *)pageViewController:(nonnull UIPageViewController *)pageViewController viewControllerBeforeViewController:(nonnull UIViewController *)viewController {
        NSUInteger currentIndex = [pages indexOfObject:viewController];
        NSUInteger previousIndex = ((currentIndex - 1) % pages.count);
        if (viewController == yourFirstViewController)
            return nil;
        return pages[previousIndex];
    }

    - (nullable UIViewController *)pageViewController:(nonnull UIPageViewController *)pageViewController viewControllerAfterViewController:(nonnull UIViewController *)viewController {
        NSUInteger currentIndex = [pages indexOfObject:viewController];
        NSUInteger nextIndex = ((currentIndex + 1) % pages.count);
        if (viewController == yourLastViewController)
            return nil;
        return pages[nextIndex];
    }

Upvotes: 1

jcaron
jcaron

Reputation: 17710

If you only have two pages, then simply check when you get a request for a page, if the current page is not already the one you would serve. For this, you need a way to identify it.

If each of the pages has a different class, you can simply check for the class. Otherwise you'll need some other criterion.

If using custom classes:

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    if ([viewController isKindOfClass:[ClassOfSecondViewController class]])
    {
        return [self.storyboard instantiateViewControllerWithIdentifier:@"one"];
    }

    return nil;
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    if ([viewController isKindOfClass:[ClassOfFirstViewController class]])
    {
        return [self.storyboard instantiateViewControllerWithIdentifier:@"two"];
    }
    return nil;
}

Upvotes: 1

Related Questions