tutorial page control iphone ios objective-c uipageviewcontroller

iphone - swift page control tutorial



UIPageViewController en iOS6 (5)

Ah, me preguntaba por qué nadie ha señalado este error, que tardé casi 2 noches en encontrar la solución.

CÓDIGO ANTIGUO (iOS 5.1): cuando devuelva cero en la primera y la última página, experimentará el bloqueo de la aplicación. Funciona bien en iOS 5.1, pero en iOS 6 no.

- (UIViewController *)pageViewController: (UIPageViewController *)pageViewController viewControllerBeforeViewController: (UIViewController *)viewController { for (UIGestureRecognizer *recognizer in pageController.gestureRecognizers) { if ([recognizer isKindOfClass:[UITapGestureRecognizer class]]) { recognizer.enabled = NO; } } NSUInteger index = [self indexOfViewController: (MainViewController *)viewController]; if ((index == 0) || (index == NSNotFound)) { return nil; } index--; return [self viewControllerAtIndex:index]; } - (UIViewController *)pageViewController: (UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { for (UIGestureRecognizer *recognizer in pageController.gestureRecognizers) { if ([recognizer isKindOfClass:[UITapGestureRecognizer class]]) { recognizer.enabled = NO; } } NSUInteger index = [self indexOfViewController: (MainViewController *)viewController]; if (index == NSNotFound) { return nil; } }

SOLUCIÓN (iOS 6): después de agregar el efecto de gesto a la supervisión, simplemente llame al delegado llamado - (BOOL) por el que se reconoce el gesto. Reconocimiento: debería (UIGestureRecognizer *) el gesto por el reconocimiento. Lo que hice es simple, calculando la velocidad del usuario que pasa la primera página y la última página (me refiero a usar el reconocedor de gestos), negué el deslizamiento. Todo lo que necesita hacer es pegar el siguiente código y listo. !.

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { if (pageNum==0) { if ([(UIPanGestureRecognizer*)gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && [(UIPanGestureRecognizer*)gestureRecognizer velocityInView:gestureRecognizer.view].x > 0.0f) { //NSLog(@"Swiping to left on 1st page is denied"); return NO; } if ([(UITapGestureRecognizer*)gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]] && [(UITapGestureRecognizer*)gestureRecognizer locationInView:gestureRecognizer.view].x < self.view.frame.size.width/2) { //NSLog(@"tapping to left on 1st page is denied"); return NO; } } else if(pageNum ==totalNoOfFiles-1) { if ([(UIPanGestureRecognizer*)gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && [(UIPanGestureRecognizer*)gestureRecognizer velocityInView:gestureRecognizer.view].x < 0.0f) { //NSLog(@"Swiping to right on 1st page is denied"); return NO; } if ([(UITapGestureRecognizer*)gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]] && [(UITapGestureRecognizer*)gestureRecognizer locationInView:gestureRecognizer.view].x > self.view.frame.size.width/2) { //NSLog(@"Tapping to right on 1st page is denied"); return NO; } } return YES; } - (UIViewController *)pageViewController:(UIPageViewController*) pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { int index = [self indexOfViewController:(ChildViewController *)viewController]; index--; return [self viewControllerAtIndex:index]; } - (UIViewController *)pageViewController: (UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { int index = [self indexOfViewController:(ChildViewController *)viewController]; index++; return [self viewControllerAtIndex:index]; }

En iOS6 en los métodos viewControllerAfterViewController y viewControllerBeforeViewController si devuelvo nil (para bloquear la navegación de la página cuando estoy en la primera o la última página) la aplicación falla con esta excepción

''El número de controladores de vista proporcionados (0) no coincide con el número requerido (1) para la transición solicitada''

En iOS5 todo funciona bien.


Esto ha sido bien discutido pero tengo una cosa que añadir. Considere por qué estaba estableciendo el delegado de los reconocedores de gestos a sí mismo. En mi caso, se debió a que en algunos casos quise evitar que los reconocedores de gestos reconocieran, con el gesto del delegado, Reconocimiento, gestureRecognizerShouldBegin:

Pero en iOS 6, donde surge este problema, hay una forma totalmente nueva de hacer exactamente eso, mediante la implementación de gestos de reconocimiento de inicio de sesión gestureRecognizerShouldBegin: en una vista UIV. (Este es un nuevo método de instancia UIView en iOS 6).

Así pude lograr exactamente lo que estaba logrando antes, sin alterar el gesto del delegado de los reconocedores.


Totalmente el mismo problema aquí.

Lo que hice fue un hotfix que solo devuelve el clon de before / afterViewController en lugar de nil, es decir,

// viewController = before/afterViewController NSUInteger index = [self indexOfViewController:viewController]; // NOTE: return nil crashes in iOS6 return [self viewControllerAtIndex:index storyboard:viewController.storyboard];

Esto significa que puede hacer un curl de página para siempre, pero no tuve otra opción ... Una mejor solución siempre es bienvenida.


Tuve el mismo problema. Descubrí que la causa era reemplazar al delegado en UIPanGestureRecognizer de UIPageViewController, un no-no realmente. El reconocedor de gestos de pan estaba llamando a un método no documentado _gestureRecognizerShouldBegin: (note el subrayado principal) que UIPageViewController implementa y aparentemente confía en que funcione correctamente (lea: no se cuelgue). Terminé implementando respondsToSelector: y reenviandoTargetForSelector: en mi clase que usa el UIPageViewController para pasar el método de delegado no documentado al UIPageViewController sin nombrarlo específicamente (y casi seguramente me otorga un rechazo de revisión de la tienda de aplicaciones).

-(BOOL)respondsToSelector:(SEL)aSelector { if ([super respondsToSelector:aSelector]) return YES; else if ([self.pageViewController respondsToSelector:aSelector]) return YES; else return NO; } - (id)forwardingTargetForSelector:(SEL)aSelector { if ([super respondsToSelector:aSelector]) { return nil; } else if ([self.pageViewController respondsToSelector:aSelector]) { return self.pageViewController; } return nil; }

Mi solución a largo plazo será volver a trabajar el uso de UIPageViewController para que no tenga que desplazar a los delegados del reconocedor de gestos.


Tuve el problema con el bloqueo de UIPageViewController con iOS6 con el mismo error (''El número de controladores de vista proporcionados (0) no coincide con el número requerido (1) para la transición solicitada'').

Ninguna de las soluciones anteriores funcionó para mí, pero al final encontré que mover la siguiente línea de viewDidLoad a viewDidAppear solucionó.

self.view.gestureRecognizers = self.pageViewController.gestureRecognizers;