pageviewcontroller page iphone ios objective-c uiviewcontroller ios7

iphone - UIPageViewController vs UIViewControllerInteractiveTransitioning



swift 4 pageviewcontroller (1)

Pregunta simple, he hecho una cantidad decente de exploración alrededor de la navegación / transiciones personalizadas entre UIViewController y no UIViewController claro lo siguiente:

Estoy buscando un comportamiento similar al que proporciona UIPageViewController (navegación no basada en pila hacia adelante y hacia atrás a través de "páginas" de contenido). Pero quiero poder personalizar las transiciones, y quiero que las transiciones sean interactivas vinculadas a un UIPanGestureRecognizer personalizado.

Parece que el protocolo UIViewControllerInteractiveTransitioning proporciona algo de lo que quiero (interactividad, transiciones personalizadas). Pero debido a que las transiciones se invocan únicamente con presentViewController:animated: and dismissViewControllerAnimated: parece que se ha creado exclusivamente para usar con la navegación basada en pila (es decir, UITabBarController , UITabBarController , presentación modal). Es decir, no parece que UIPageViewController a jugar bien con algo como UIPageViewController .

Si uso la contención de UIViewController para crear un contenedor personalizado similar a UIPageViewController (vea la demostración en curso here ), ¿puedo integrar el protocolo de UIViewControllerInteractiveTransitioning en esto para impulsar las transiciones? ¿O debo enrollar eso por mi cuenta (actualmente tengo una implementación manual aproximada de transiciones interactivas)?


Hago muchas animaciones personalizadas en mis aplicaciones que la mayoría de los desarrolladores evitan porque uso mucho UIViewControlloer Containment en mi trabajo.

Es la forma más sencilla de obtener las transiciones que estás buscando.

Así es como lo haría:

  1. Crear un controlador de vista base; Llamémoslo MainViewController. Tendrá referencias a todos los demás controladores de vista y mantendrá la lógica de las transiciones. También debe seguir un protocolo que definiremos como ViewXControllerDelegate.

  2. Crea tus otros controladores de vista; llamémoslos View1Controller, View2Controller, View3Controller. Agregue una instancia de cada uno de ellos como propiedades privadas de MainViewController. En el método init de MainViewController, cree una instancia y agregue sus vistas como subvistas de la vista de MainViewController. Debería verse algo como esto:

    self.v1c = [[View1Controller alloc]init]; [self addChildViewController:self.v1c]; [self.v1c didMoveToParentViewController:self]; //Setup each subview so that its frame makes it off screen or //On screen depending on the app state and where you want each //subview to animate to/from [self.view addSubview:self.v1c.view]; ....

  3. Configure un UIPanGestureRecognizer en cada uno de sus ViewXControllers que tiene su objetivo y su selector configurados en el controlador de vista principal (MainViewController).

  4. Maneje toda la lógica en su clase MainViewController donde tenga en cuenta la distancia recorrida, el estado de la aplicación, las ubicaciones de cada una de las vistas (usando propiedades auxiliares en los controladores ViewXControllers como "inactiveFrame" o "activeFrame" donde la animación entre ellos se basa en el Porcentaje de movimiento que se ha producido en el gesto pan.