49 votes

UIPageViewController accède à la mauvaise page avec le style de transition Scroll

Mon UIPageViewController fonctionnait bien sous iOS 5. Mais lorsque iOS 6 est apparu, je voulais utiliser le nouveau style de transition de défilement (UIPageViewControllerTransitionStyleScroll) au lieu du style curl de page. Cela a causé la rupture de mon UIPageViewController.

Cela fonctionne très bien sauf après que j'ai appelé setViewControllers:direction:animated:completion: . Après cela, la prochaine fois que l'utilisateur fait défiler manuellement une page, nous obtenons la mauvaise page. Quel est le problème ici?

81voto

George Tsifrikas Points 646

Ma solution de contournement de ce bogue consistait à créer un bloc une fois l'opération terminée, qui définissait le même contrôleur de vue mais sans animation.

 __weak YourSelfClass *blocksafeSelf = self;     
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:^(BOOL finished){
            if(finished)
            {
                dispatch_async(dispatch_get_main_queue(), ^{
                    [blocksafeSelf.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL];// bug fix for uipageview controller
                });
            }
        }];
 

63voto

matt Points 60113

C'est effectivement un bug dans UIPageViewController. Il se produit uniquement avec le défilement de style (UIPageViewControllerTransitionStylescroll) et qu'après l'appel de setViewControllers:direction:animated:completion: animés:OUI. Il y a donc deux solutions:

  1. N'utilisez pas de UIPageViewControllerTransitionStylescroll.

  2. Ou, si vous appelez setViewControllers:direction:animated:completion:, utilisez uniquement animated:NO.

Pour voir le bug clairement, appelez - setViewControllers:direction:animated:completion: et ensuite, dans l'interface utilisateur), accédez à gauche (retour) à la page précédente manuellement. Vous revenez à la page incorrecte: non pas la page précédente, mais la page que vous étiez lorsque setViewControllers:direction:animated:completion: a été appelé.

La raison pour le bug semble être que, lorsque vous utilisez le défilement de style, UIPageViewController fait un peu de tri interne de la mise en cache. Ainsi, après l'appel à setViewControllers:direction:animated:completion:, il ne parvient pas à effacer de sa mémoire cache interne. Il pense qu'il sait ce que la page précédente est. Ainsi, lorsque l'utilisateur navigue vers la gauche de la page précédente, UIPageViewController ne parvient pas à appeler la méthode de la source de données pageViewController:viewControllerBeforeViewController:, ou des appels avec le mauvais affichage en cours de la manette.

J'ai posté un film qui démontre clairement comment faire pour voir le bug:

http://www.apeth.com/PageViewControllerBug.mov

MODIFIER Ce bug sera probablement corrigé dans iOS 8.

3voto

Paul de Lange Points 6152

Voici un "brouillon" essentiel que j'ai mis en place. Il contient une alternative UIPageViewController qui souffre de la maladie d'Alzheimer (c'est-à-dire qu'elle ne dispose pas de la mise en cache interne de l'implémentation Apple).

Ce cours n'est pas complet mais il fonctionne dans ma situation (à savoir: défilement horizontal).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X