Transition UIPageViewController 'Appels non équilibrés pour commencer / terminer les transitions d'apparence pour'
Lorsque je navigue dans les UIPageViewController
plus vite que son animation de transition, je suis 'Unbalanced calls to begin/end appearance transitions for <MyDataViewController>
' et l'un des deux points de vue dans un paysage qui n'est pas visible jusqu'à ce que j'essaie de tourner la page.
Quelqu'un a une idée pour résoudre ce bug?
source d'informationauteur Basem Saadawy
Vous devez vous connecter pour publier un commentaire.
Les réponses ci-dessus ont droit, mais je pense que plus élaboré que de besoin, et un livre de recettes est utile. Voici donc ce qui semble être de travailler pour moi:
Dans la vue contrôleur qui met en place et appelle la pageViewController,
déclarer:
et dans le viewDidLoad:
ajouter ceci:
et d'ajouter quelques lignes à:
Les gestes sont supprimées par la baisse de fournir afficher les informations de contrôleur:
Oh, et les changements d'orientation de réinitialiser l'indicateur:
Résolu en suivant ces étapes:
1 - Déclarer un drapeau pour indiquer que l'animation est terminée ou pas:
2 - Définir cet indicateur de vrai dans le viewDidLoad:
3 - Désactiver tapGesture pour la pageViewController et attribue un " soi " à panGestureRecognizer délégué:
4 - Autoriser/Interdire panGestureRecognizer à travers la geste de reconnaissance de la méthode du délégué:
5 - Ajouter le suivant pageViewController délégué méthode:
Bonne réponse de Basem Saadawy, mais il a quelques défauts.
En réalité le délégué du gestureRecognizerShouldBegin: peut être appelé avec aucune autre animation a commencé. Cela est possible si vous démarrez votre geste vertical doigt du mouvement et de son décalage horizontal n'est pas assez pour démarrer l'animation (mais il est suffisant pour lancer gestureRecognizerShouldBegin:). Ainsi, notre variable pageAnimationFinished sera mis à PAS sans une réelle animation. Par conséquent, la pageViewController: didFinishAnimating: ne sera jamais appelé et vous obtenez la page en cours surgelés, sans possibilité de le changer.
C'est pourquoi une meilleure place à attribuer PAS à cette variable est un geste de reconnaissance de la méthode d'action avec l'examen de sa vitesse et de la traduction (nous sommes intéressés dans le sens horizontal uniquement).
Donc la dernière étapes sont les suivantes:
1) Déclarer une variable d'instance (un drapeau):
2) Régler la valeur initiale de la
3) Affecter un délégué et une action personnalisée à la poêle geste modules de reconnaissance
3') l'Animation est vraiment débuté à la geste de la traduction est plus dans le sens horizontal et le doigt se déplace à l'horizontale, à un moment.
Je suppose que la même logique est utilisé à l'interne de reconnaissance de l'action affectée par UIPageViewController.
4) Rejeter un geste si l'animation n'est pas fini.
5) l'Animation est terminée
J'ai trop joué avec et il semble que ce soit une belle solution qui fonctionne bien.
Voici une version RAPIDE à l'aide de la délégué:
ajouter ce code (assurez-vous que vous êtes, y compris la UIPageViewControllerDelegate dans votre en-tête ou d'extension de classe, et d'attribuer
self.pageViewController.delegate = self;
):puis vérifier
self.pageAnimationFinished
et retourner nil si c'est ==NO
.Une Longue Explication:
Nous pouvons utiliser cette méthode du délégué de
UIPageViewControllerDelegate
de savoir quand l'animation à partir de retournement ou de glisser à travers les pages de finitions. L'utilisation de ce nous venons de la mettre en oeuvre comme ceci:ensuite, il suffit de retourner
nil
dans votreet
quand
pageAnimationFinished == NO
. Assurez-vous de définirpageAnimationFinished
àNO
lorsque vous animez. La meilleure façon de savoir quand vous animez est en utilisant l'inverse deà savoir:
Je n'ai pas vu cet avertissement que jamais depuis, et cela peut être fait dans 1/3 des lignes que les autres solutions. Et il est BEAUCOUP plus facile à suivre.
Voici la Swift version de Bill Cheswick réponse (actuellement la première réponse):
Ajouter une variable pour contenir l'état actuel:
Ensemble de l'animation de l'etat:
Bloquer les transitions si elle est en cours d'animation:
Merci Bill Cheswick!
Ma solution rapide, simple et de travail:
Ajouter le code ci-dessous
Comment à ce sujet:
Faire usage de votre UIPageViewControllerDelegate méthodes et mis en place des gardes pour empêcher la création de nouvelles vues de page lorsque la page excessif virages sont détectés.
J'ai dû ajouter à viewDidAppear: pour le faire fonctionner
Je vais essayer de l'ignorer geste sur UIPageViewControllers lors de la transition.