J'utilise UIPageViewController pour afficher des images en plein écran. UIViewController, qui est ajouté à UIPageController en tant que sous-vue/enfant, affiche les images à l'aide d'ImageView. Le problème, c’est que les images ne passent pas en plein écran. Au lieu de cela, la vue pagecontrol apparaît en bas et cet espace est complètement perdu. S'il vous plaît vérifier l'image ci-jointe.
Voici le code
self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
self.pageController.dataSource = self;
[[self.pageController view] setFrame:[[self view] bounds]];
NewsItemViewController *initialViewController = [self viewControllerAtIndex:0];
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];
Ici NewsItemViewController est UIViewController montrant des images et du texte et MainViewController implémente le protocole UIPageViewControllerDataSource et les méthodes nécessaires dans MainViewController.
Je crois qu'il doit y avoir un moyen de montrer les choses en plein écran.
*** MainViewController fait également partie d'un storyboard, si cela compte.
Enfin, j'ai eu la solution moi-même. Je viens juste de cacher le contrôle de page à UIViewPageController, puis d'étendre la taille de UIPageViewController pour couvrir le vide laissé par l'absence de contrôle de page.
NSArray *subviews = self.pageController.view.subviews;
UIPageControl *thisControl = nil;
for (int i=0; i<[subviews count]; i++) {
if ([[subviews objectAtIndex:i] isKindOfClass:[UIPageControl class]]) {
thisControl = (UIPageControl *)[subviews objectAtIndex:i];
}
}
thisControl.hidden = true;
self.pageController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height+40);
Curieuse. Les docs say:
Si les deux méthodes de la section «Prise en charge d’un indicateur de page» sont mises en œuvre Et que le style de transition du contrôleur d’affichage de page est défini sur UIPageViewControllerTransitionStyleScroll, un indicateur de page est visible.
Ces deux méthodes sont:
- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController {
}
- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController {
}
Implémentez-vous ces deux méthodes de source de données? Si c'est le cas, peut-être que si vous les supprimez, vous ne devrez pas supprimer manuellement le contrôle de page (points)? Un test rapide serait de changer le
UIPageViewControllerTransitionStyleScroll
à
UIPageViewControllerTransitionStylePageCurl
et voir si les points indicateurs de contrôle de page disparaissent. (Après avoir commenté votre méthode de peau, bien sûr.)
Les points UIPageViewController ne sont affichés que lorsque vous avez implémenté la méthode suivante:
- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController;
vérifiez votre code. et retourner aussi zéro dans cette méthode va cacher les points (UIPageControl)
J'ajoute pour le code compatible Swift 2.2
for view in self.view.subviews {
if view.isKindOfClass(UIScrollView) {
view.frame = UIScreen.mainScreen().bounds
} else if view.isKindOfClass(UIPageControl) {
view.backgroundColor = UIColor.clearColor()
}
}
Ceci est la solution compatible Swift 4, intégrée dans viewDidLayoutSubviews
for view in self.view.subviews {
if view.isKind(of:UIScrollView.self) {
view.frame = UIScreen.main.bounds
} else if view.isKind(of:UIPageControl.self) {
view.backgroundColor = UIColor.clear
}
}
Version rapide :). Renvoie zéro pour une implémentation inférieure à la sous-classe UIPageViewController. Func presentationCountForPageViewController (pageViewController: UIPageViewController) -> Int {return 0}
func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { return 0 }
Collez le code ci-dessous dans votre UIPageViewController:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if let pageScrollView = view.subviews.first {
pageScrollView.frame = view.bounds
}
}
Réglez votre contrôleur de pager comme
self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
self.pageController.dataSource = self;
[[self.pageController view] setFrame:[[self view] bounds]];
Et implémenter, cette méthode devrait retourner toute valeur supérieure à 1
- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController {
// The selected item reflected in the page indicator.
return 2;
}
Maintenant, l’espace au bas de l’espace est supprimé et aucun contrôle de page n’est affiché :)