web-dev-qa-db-fra.com

Masquer les points de UIPageViewController

Je voudrais faire une chose assez simple. Retirez simplement tous les points et la barre en bas de l'UIPageViewController.

Voici la configuration: j'ai un contrôleur de vue personnalisé qui a UIPageViewController * pageController Je l'affiche comme ceci:

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];

Des idées sur la façon de supprimer les points?

55
Stefan Salatic

Le contrôle de page s'affiche uniquement si la source de données implémente ces méthodes:

presentationCountForPageViewController:
presentationIndexForPageViewController:

Supprimez simplement votre implémentation de ceux-ci et le contrôle de page ne s'affichera pas. De la documentation de la source de données :

Si les deux méthodes de "Prise en charge d'un indicateur de page" sont implémentées et que le style de transition du contrôleur de vue de page est UIPageViewControllerTransitionStyleScroll, un indicateur de page est visible.

197
jrturton

Dans ma situation, j'ai plusieurs UIPageViewControllers (créés à partir de - [UITableView didSelectRowAtIndexPath]), dont certains ne contiennent qu'une seule page. Au lieu d'utiliser différents contrôleurs pour différentes lignes UITableView, j'ai implémenté la méthode déléguée UIPageViewController comme suit:

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

Cela renvoie 0 s'il n'y a qu'une seule page qui semble empêcher UIPageViewController d'afficher les points. C'est un kludge mais cela semble fonctionner (iOS SDK 7.0).

Je suppose qu'un moyen "plus propre" serait de supprimer les méthodes au moment de l'exécution pour les UIPageControllers ayant seulement 1 page, mais cela impliquerait une manipulation fantaisiste de l'exécution objC.

Des commentaires sur cette approche?

11
mts

Si vous souhaitez masquer ces points dynamiquement au moment de l'exécution, retournez -1 du délégué presentationIndexForPageViewController:

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

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

Dans ce cas, si vous n'avez qu'une seule page (recto), les points seront masqués.

4
iOSergey

Les correctifs ci-dessus fonctionnent correctement avec un nombre fixe de pages au début.

J'ai essayé différentes approches pour résoudre le problème lorsque les pages peuvent être augmentées ou diminuées dynamiquement.

J'ai donc utilisé la méthode ci-dessous qui masquera manuellement le composant lui-même.

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
        }
    }
}

Et cela devrait être appelé de

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

    togglePageControl(pageCount: pages.count)

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

    return pages.count
}
1
muhammed basil