Comment savez-vous quelle est la page / vue actuelle affichée dans un UIPageViewController
?
J'ai remplacé la viewDidAppear
méthode de mes vues enfants, afin qu'elles envoient un identifiant à la vue parent dans leur viewDidAppear
méthode.
Cependant, le problème est le suivant: je ne peux pas utiliser de manière fiable cet identifiant comme identifiant pour la page affichée. car si l'utilisateur tourne la page mais à mi-parcours décide d'arrêter le tournage et de remettre la page, il viewDidAppear
aura déjà été appelé. (la vue est visible derrière la page enroulée).
Peut-être que je ne devrais passer à un nouvel identifiant que si la vue actuelle disparaît. Mais je me demande s'il n'y a pas un moyen plus simple de retourner la vue actuellement visible?
viewDidAppear:animated:
place?Réponses:
Vous devez effectuer manuellement le suivi de la page actuelle. La méthode déléguée
pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:
vous indiquera quand mettre à jour cette variable. Le dernier argument de la méthodetransitionCompleted:
peut vous dire si un utilisateur a effectué une transition de changement de page ou non.la source
Depuis iOS 6, j'ai constaté que la
viewControllers
propriété d'UIPageViewController se mettait constamment à jour afin qu'elle contienne toujours le contrôleur de vue unique qui représente la page actuelle, et rien d'autre. Ainsi, vous pouvez accéder à la page actuelle en appelantviewControllers[0]
(en supposant que vous n'affichez qu'un seul contrôleur de vue à la fois).Le tableau viewController ne se met à jour qu'une fois la page "verrouillée" en place, donc si un utilisateur décide de révéler partiellement la page suivante, elle ne devient pas la page "courante" à moins qu'il n'achève la transition.
Si vous souhaitez garder une trace des «numéros de page», attribuez à vos contrôleurs de vue une valeur d'index lorsque vous les créez via les méthodes de source de données UIPageViewController.
Donc par exemple:
Mais notez les commentaires selon lesquels ce n'est pas fiable.
la source
viewControllers
propriété et j'obtiens les bons contrôleurs de vue, mais lorsque je tourne, sur la méthodespineLocationForInterfaceOrientation
, je n'obtiens plus les bons contrôleurs de vue. Je me suis donc tenu à maintenir ma propre propriété currentPage au lieu de toujours compter sur leviewControllers
.Malheureusement, toutes les méthodes ci-dessus ne m'ont pas aidé. Néanmoins, j'ai trouvé la solution en utilisant des balises. Ce n'est peut-être pas le meilleur, mais cela fonctionne et j'espère que cela aidera quelqu'un:
Dans Swift: (merci à @Jessy )
Exemple: gist
la source
S'appuyant sur la réponse d'Ole…
Voici comment j'ai implémenté les 4 méthodes pour suivre la page actuelle et mettre à jour l'indicateur de page avec l'index correct:
la source
self.nextIndex = self.currentIndex
plutôt queself.nextIndex = 0
pour restaurer correctement l'index lorsqu'une transition n'est pas terminée. Sinon , vous risquez de se retrouver avec unecurrentIndex
valeur de 0 lorsque la pagination rapidement et - vient quelque part au milieu de vos pages.La solution ci-dessous a fonctionné pour moi.
Apple pourrait éviter beaucoup de tracas en rendant la pagination de la vue par défilement UIPageViewController native plus configurable. J'ai dû recourir à la superposition d'un nouvel UIView et UIPageControl simplement parce que la pagination native UIPageViewController ne prend pas en charge un arrière-plan transparent ou un repositionnement dans le cadre de vue.
la source
Swift 4
Aucun code inutile. 3 façons de le faire. Utilisation de la méthode UIPageViewControllerDelegate .
la source
pageViewController.viewControllers
. Comment connaissez-vous viewControllers? .First est celui en question?Je garde une trace de l'index de la page en utilisant une petite fonction et en spécifiant pageIndex comme NSInteger statique.
et appeler
[self setPageIndex];
à l'intérieur de la fonction spécifiée par Ole et également après avoir détecté le changement d'orientation.la source
J'ai d'abord utilisé la solution de Corey mais cela ne fonctionnait pas sur iOS5 puis j'ai fini par utiliser,
Il a essayé de passer d'une page à l'autre et cela fonctionne bien pour le moment.
la source
Malheureusement, rien ci-dessus ne fonctionne pour moi.
J'ai deux contrôleurs de vue et quand je fais défiler légèrement (environ 20px) la dernière vue vers l'arrière, cela déclenche le délégué:
pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:
et dire que la page courante (index) est
0
ce qui est faux.Utilisation du délégué dans le viewController enfant quelque chose comme:
qui est déclenché à l'intérieur
viewDidAppear
comme:A travaillé pour moi.
la source
Cela fonctionne pour moi de manière fiable
J'ai un UIPageController personnalisé. Cette pageController.currentPage est mise à jour à partir du UIViewController affiché dans la vueWillAppear
la source
J'utilise
view.tag
depuis un moment maintenant, essayer de garder une trace de la page actuelle était trop compliqué.Dans ce code, l'index est stocké dans la
tag
propriété de chacunview
et est utilisé pour récupérer le VC suivant ou précédent. En utilisant cette méthode, il est également possible de créer un défilement infini. Consultez le commentaire dans le code pour afficher également cette solution:la source
Merci pour votre réponse les gars, j'ai rencontré un problème similaire, j'ai dû stocker l'index. Je modifie légèrement mon code, collez-le ci-dessous:
la source
la source
Ci-dessous le code de démonstration (dans Swift 2) qui montre comment cela est fait en implémentant un simple tutoriel de balayage d'image. Commentaires dans le code lui-même:
la source
J'ai un tableau viewControllers, que j'affiche dans UIPageViewController .
Chose importante à noter est que la setViewControllers méthode de UIPageViewController ne donne pas de rappel de délégué. Les rappels délégués représentent uniquement les actions tactiles de l'utilisateur dans UIPageViewController .
la source
Voici la solution que j'ai trouvée:
Usage:
Assurez-vous de définir le titre initial
la source
La façon la plus simple d'aborder cette IMHO est d'utiliser le PageControl pour stocker le résultat potentiel de la transition, puis revenir si la transition a été annulée. Cela signifie que le contrôle de la page change dès que l'utilisateur commence à balayer, ce qui me convient. Cela nécessite que vous ayez votre propre tableau de UIViewControllers (dans cet exemple appelé
allViewControllers
)la source
Que diriez-vous de demander un
viewController
directement à partir de laUIPageViewController
(version Swift 4):Ou, si vous avez simplement besoin du contrôleur de vue actuellement présenté à un moment donné, utilisez simplement
pageViewController.viewControllers?.first
à ce moment-là.la source
Dans Swift 5 et après la réponse de sirvine
Dans ce cas, je me fiche de la classe d'UIViewController intégrée
la source
Il renverra l'index de la page actuelle. et doit utiliser ce code sous la fonction déléguée de UIPageViewController (didFinishAnimating).
la source