Hide dots from UIPageViewController

IosCocoa TouchIos7UipageviewcontrollerUipagecontrol

Ios Problem Overview


I would like to do to a pretty simple thing. Just remove all the dots, and the bar on the bottom of the UIPageViewController.

This is the setup: I have a custom view controller which has UIPageViewController *pageController I display it like this:

self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];

self.pageController.dataSource = self;
[[self.pageController view] setFrame:[self.view bounds]];

BSItemPageViewController *initialViewController = [self viewControllerAtIndex:selectedIndex];

NSArray *viewControllers = [NSArray arrayWithObject:initialViewController];

[self.pageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

[self addChildViewController:self.pageController];
[[self view] addSubview:[self.pageController view]];
[self.pageController didMoveToParentViewController:self];

Any ideas on how do I remove the dots?

Ios Solutions


Solution 1 - Ios

The page control is only displayed if the datasource implements these methods:

presentationCountForPageViewController:
presentationIndexForPageViewController:

Simply remove your implementation of these, and the page control will not be displayed. From the datasource docs:

>If both of the methods in “Supporting a Page Indicator” are implemented and the page view controller’s transition style is UIPageViewControllerTransitionStyleScroll, a page indicator is visible.

Solution 2 - Ios

In my situation I have multiple UIPageViewControllers (created from -[UITableView didSelectRowAtIndexPath]), some of which contain only 1 page. Instead of using different controllers for different UITableView rows, I implemented the UIPageViewController delegate method as follows:

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController {
    return ([self numberOfPages] == 1 ? 0 : [self numberOfPages]);
}

This returns 0 if there is only 1 page which seems to make UIPageViewController not show the dots. It's a kludge but it appears to work (iOS SDK 7.0).

I suppose a "cleaner" way would be to remove the methods at runtime for those UIPageControllers having only 1 page, but this would involve some fancy objC runtime manipulation.

Comments on this approach?

Solution 3 - Ios

If you want to hide those dots dynamically at runtime, then return -1 from the presentationIndexForPageViewController delegate:

func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
    return yourPageVCs.count
}

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
    return yourPageVCs.count > 1 ? 0 : -1
}

In this case if you have only 1 (single sided) page, dots will be hidden.

Solution 4 - Ios

The above fixes works fine with fixed number of pages at the beginning.

I tried different approaches to solve the problem when pages can be increased or decreased dynamically.

So I used below method which will manually hide the component itself.

func togglePageControl(pageCount: Int, threshold: Int = 1) {

    var hidden = true

    if pageCount > threshold {

        hidden = false

    }

    for subView in self.view.subviews {
        if subView is UIScrollView {
            subView.frame = self.view.bounds
        } else if subView is UIPageControl {
            subView.isHidden = hidden
        }
    }
}

And this should be called from

public func presentationCount(for pageViewController: UIPageViewController) -> Int {

    togglePageControl(pageCount: pages.count)

    // or togglePageControl(pageCount: pages.count, threshold: 5)

    return pages.count
}

Solution 5 - Ios

As Lee pointed out, simply not implementing the methods presentationCountForPageViewController and presentationCountForPageViewController suffers from an accessibility issue during voiceover where it won't read out the page number (1 of 5, 2 of 5, etc.). A solution that will support accessibility is:

// Swift
let proxy = UIPageControl.appearance()
proxy.isHidden = true

// Objective-C
UIPageControl *proxy = [UIPageControl appearance];
[proxy setHidden:YES];

This has the added benefit of maintaining a cleaner separation between the data source and its presentation.

UPDATE: This is unfortunately not a perfect solution since it hides the control but doesn't remove it (there remains an empty space the same height of the hidden control). I haven't yet been able to find a way to configure the existing control to fix this issue.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionStefan SalaticView Question on Stackoverflow
Solution 1 - IosjrturtonView Answer on Stackoverflow
Solution 2 - IosmtsView Answer on Stackoverflow
Solution 3 - IosiOSergeyView Answer on Stackoverflow
Solution 4 - Iosmuhammed basilView Answer on Stackoverflow
Solution 5 - IosDanielView Answer on Stackoverflow