NavigationControllers tiene pilas de ViewController para administrar y transiciones de animación limitadas.
Agregar un controlador de vista como una vista secundaria a un controlador de vista existente requiere pasar eventos al controlador de vista secundaria, lo cual es difícil de manejar, cargado de pequeñas molestias y, en general, se siente como un mal truco cuando se implementa (Apple también recomienda no haciendo esto).
La presentación de un controlador de vista modal nuevamente coloca un controlador de vista encima de otro, y aunque no tiene el problema de pasar el evento descrito anteriormente, realmente no 'intercambia' el controlador de vista, lo apila.
Los guiones gráficos están limitados a iOS 5 y son casi ideales, pero no se pueden usar en todos los proyectos.
¿Puede alguien presentar un EJEMPLO DE CÓDIGO SÓLIDO para cambiar los controladores de vista sin las limitaciones anteriores y permitir transiciones animadas entre ellos?
Un ejemplo cercano, pero sin animación: cómo usar múltiples controladores de vista personalizados de iOS sin un controlador de navegación
Editar: el uso del controlador de navegación está bien, pero debe haber estilos de transición animados (no solo los efectos de diapositiva), el controlador de vista que se muestra debe intercambiarse por completo (no apilarse). Si el segundo controlador de vista debe eliminar otro controlador de vista de la pila, entonces no está lo suficientemente encapsulado.
Edición 2: iOS 4 debería ser el sistema operativo base para esta pregunta, debería haber aclarado eso al mencionar guiones gráficos (arriba).
fuente
Respuestas:
EDITAR: Nueva respuesta que funciona en cualquier orientación. La respuesta original solo funciona cuando la interfaz está en orientación vertical. Estas son animaciones de transición de vista b / c que reemplazan una vista con una vista diferente que debe ocurrir con vistas al menos un nivel por debajo de la primera vista agregada a la ventana (por ejemplo
window.rootViewController.view.anotherView
).He implementado una clase de contenedor simple que llamé
TransitionController
. Puede encontrarlo en https://gist.github.com/1394947 .Por otro lado, prefiero la implementación en una clase separada b / c, es más fácil de reutilizar. Si no quiere eso, simplemente podría implementar la misma lógica directamente en el delegado de su aplicación eliminando la necesidad de la
TransitionController
clase. Sin embargo, la lógica que necesitarías sería la misma.Úselo de la siguiente manera:
En su delegado de aplicaciones
Para pasar a un nuevo controlador de vista desde cualquier controlador de vista
EDITAR: Respuesta original a continuación: solo funciona para la orientación de retrato
Hice los siguientes supuestos para este ejemplo:
Tiene un controlador de vista asignado como el
rootViewController
de su ventanaCuando cambia a una nueva vista, desea reemplazar el viewController actual con el viewController que posee la nueva vista. En cualquier momento, solo el viewController actual está activo (por ejemplo, asignado).
El código se puede modificar fácilmente para que funcione de manera diferente, el punto clave es la transición animada y el controlador de vista única. Asegúrese de no retener un controlador de vista en ningún lugar fuera de su asignación
window.rootViewController
.Código para animar la transición en el delegado de la aplicación
Ejemplo de uso en un controlador de vista
fuente
TransitionController.m
aUIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
, pero solo lo he usado en la versión más reciente de iOS, así que pruébelo con cuidado.Puede usar el nuevo sistema de contención viewController de Apple. Para obtener información más detallada, consulte el video de la sesión de WWDC 2011 "Implementación de la
UIViewController
contención".Nuevo en iOS5,
UIViewController
Containment le permite tener un viewController primario y varios viewControllers secundarios que están contenidos en él. Así es como funciona el UISplitViewController. Al hacer esto, puede apilar los controladores de vista en un padre, pero para su aplicación particular solo está usando el padre para administrar la transición de un viewController visible a otro. Esta es la forma aprobada por Apple de hacer las cosas y animar desde una vista infantil. ¡Además, puedes usar todas las diferentesUIViewAnimationOption
transiciones!Además, con UIViewContainment, no tiene que preocuparse, a menos que lo desee, por el desorden de administrar los controles de vista secundarios durante los eventos de orientación. Simplemente puede usar lo siguiente para asegurarse de que su parentViewController reenvíe los eventos de rotación a los viewControllers secundarios.
Puede hacer lo siguiente o similar en el método viewDidLoad de sus padres para configurar el primer childViewController:
luego, cuando necesite cambiar el viewController secundario, llame a algo similar a lo siguiente dentro del viewController primario:
Publiqué un proyecto de ejemplo completo aquí: https://github.com/toolmanGitHub/stackedViewControllers . Este otro proyecto muestra cómo usar la
UIViewController
contención en algunos tipos de controles de vista de entrada diferentes que no ocupan toda la pantalla. Buena suertefuente
[self.currentViewController willMoveToParentViewController:nil];
antes de la transición?OK, sé que la pregunta dice sin usar un controlador de navegación, pero no hay razón para no hacerlo. OP no respondió a los comentarios a tiempo para que me fuera a dormir. No me rechaces. :)
Aquí le mostramos cómo hacer estallar el controlador de vista actual y pasar a un nuevo controlador de vista usando un controlador de navegación:
fuente
Dado que acabo de encontrarme con este problema exacto y probé variaciones en todas las respuestas preexistentes a un éxito limitado, publicaré cómo finalmente lo resolví:
Como se describe en esta publicación sobre segues personalizados , en realidad es muy fácil hacer segues personalizados. También son súper fáciles de conectar en Interface Builder, mantienen visibles las relaciones en IB y no requieren mucho apoyo de los controladores de vista de origen / destino de la segue.
La publicación vinculada anteriormente proporciona el código iOS 4 para reemplazar el controlador de vista superior actual en la pila de NavigationController por uno nuevo que utiliza una animación de deslizamiento desde arriba.
En mi caso, quería que sucediera un reemplazo similar, pero con una
FlipFromLeft
transición. También solo necesitaba soporte para iOS 5+. Código:Desde RAFlipReplaceSegue.h:
Desde RAFlipReplaceSegue.m:
Ahora, arrastre el control para configurar cualquier otro tipo de segue, luego conviértalo en un Segue personalizado y escriba el nombre de la clase de segue personalizada, ¡y listo!
fuente
–performSegueWithIdentifier:sender:
método UIViewController .Luché con este durante mucho tiempo, y uno de mis problemas se enumera aquí , no estoy seguro de si ha tenido ese problema. Pero esto es lo que recomendaría si debe funcionar con iOS 4.
En primer lugar, crea una nueva
NavigationController
clase. Aquí es donde haremos todo el trabajo sucio: otras clases podrán llamar "limpiamente" a métodos de instancia comopushViewController:
y tal. En su.h
:La matriz de controladores de vista secundarios servirá como una tienda para todos los controladores de vista en nuestra pila. Reenviaríamos automáticamente toda la rotación y el cambio de tamaño del código desde la
NavigationController
vista de 's alcurrentController
.Ahora, en nuestra implementación:
Ahora puede implementar su propia costumbre
pushViewController:
,popViewController
y tal, utilizando estas llamadas a métodos.¡Buena suerte y espero que esto ayude!
fuente
viewWillAppear
,viewDidAppear
y tales.Prueba este código.
Este código proporciona la transición de un controlador de vista a otro controlador de vista que tiene un controlador de navegación.
fuente