[Iphone] ¿Anima a los controladores de cambio de vista sin usar la pila del controlador de navegación, las subvistas o los controladores modales?


Answers

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 la WWDC 2011 "Implementación de la contención de UIViewController ".

Nuevo en iOS5, la contención de UIViewController permite tener un control de vista principal y una cantidad de controles de vista 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 elemento principal para administrar la transición de un controlador de vista visible a otro. Esta es la forma de hacer las cosas aprobada por Apple y animar desde un niño viewController es sencillo. ¡Además, puedes usar todas las diferentes transiciones UIViewAnimationOption !

Además, con UIViewContainment, no tiene que preocuparse, a menos que lo desee, del desorden de la administración de los viewControllers secundarios durante los eventos de orientación. Simplemente puede usar lo siguiente para asegurarse de que parentViewController reenvíe los eventos de rotación a los viewControllers secundarios.

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers{
    return YES;
}

Puede hacer lo siguiente o similar en el método viewDidLoad de su padre para configurar el primer childViewController:

[self addChildViewController:self.currentViewController];
[self.view addSubview:self.currentViewController.view];
[self.currentViewController didMoveToParentViewController:self];
[self.currentViewController.swapViewControllerButton setTitle:@"Swap" forState:UIControlStateNormal];

luego, cuando necesite cambiar el niño viewController, llame algo de la siguiente manera dentro del padre ViewController:

-(void)swapViewControllers:(childViewController *)addChildViewController:aNewViewController{
     [self addChildViewController:aNewViewController];
     __weak __block ViewController *weakSelf=self;
     [self transitionFromViewController:self.currentViewController
                       toViewController:aNewViewController
                               duration:1.0
                                options:UIViewAnimationOptionTransitionCurlUp
                             animations:nil
                             completion:^(BOOL finished) {
                                   [aNewViewController didMoveToParentViewController:weakSelf];

                                   [weakSelf.currentViewController willMoveToParentViewController:nil];
                                   [weakSelf.currentViewController removeFromParentViewController];

                                   weakSelf.currentViewController=[aNewViewController autorelease];
                             }];
 }

Publiqué un proyecto de ejemplo completo aquí: https://github.com/toolmanGitHub/stackedViewControllers . Este otro proyecto muestra cómo usar la contención de UIViewController en algunos tipos de input viewController que no ocupan toda la pantalla. Buena suerte

Question

NavigationControllers tiene pilas de ViewController para administrar, y transiciones de animación limitadas.

Agregar un controlador de vista como una sub-vista a un controlador de vista existente requiere pasar eventos al controlador de subvista, lo cual es difícil de manejar, cargado con pequeñas molestias y en general se siente como un mal truco cuando se implementa (Apple también recomienda haciendo esto).

La presentación de un controlador de vista modal coloca nuevamente un controlador de vista encima de otro y, aunque no tiene los problemas de suceso descritos anteriormente, en realidad no 'intercambia' el controlador de vista, sino que 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 en una forma de cambiar los controladores de vista sin las limitaciones anteriores y permite transiciones animadas entre ellos?

Un ejemplo cercano, pero sin animación: cómo usar múltiples controles de vista personalizados iOS sin un controlador de navegación

Editar: el uso del controlador Nav está bien, pero es necesario que haya estilos de transición animados (no simplemente los efectos de diapositivas). El controlador de visualización 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).




UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UINavigationController *viewController = (UINavigationController *)[storyboard instantiateViewControllerWithIdentifier:@"storyBoardIdentifier"];
viewController.modalTransitionStyle = UIModalTransitionStylePartialCurl;
[self presentViewController:viewController animated:YES completion:nil];

Prueba este código

Este código da Transición desde un controlador de vista a otro controlador de vista que tiene un controlador de navegación.




Como me topé con este problema exacto y probé variaciones en todas las respuestas preexistentes al éxito limitado, publicaré cómo finalmente lo resolví:

Como se describe en esta publicación sobre segues personalizados , en realidad es realmente fácil hacer segues personalizados. También son muy fáciles de conectar en Interface Builder, mantienen las relaciones en IB visibles, y no requieren mucho soporte por parte de los controladores de vista fuente / destino de segue.

La publicación vinculada anteriormente proporciona el código de iOS 4 para reemplazar el controlador de vista superior actual en la pila de navigationController por uno nuevo con una animación de deslizamiento desde arriba.

En mi caso, quería que sucediera un cambio de reemplazo similar, pero con una transición de FlipFromLeft . También solo necesitaba soporte para iOS 5+. Código:

De RAFlipReplaceSegue.h:

#import <UIKit/UIKit.h>

@interface RAFlipReplaceSegue : UIStoryboardSegue
@end

De RAFlipReplaceSegue.m:

#import "RAFlipReplaceSegue.h"

@implementation RAFlipReplaceSegue

-(void) perform
{
    UIViewController *destVC = self.destinationViewController;
    UIViewController *sourceVC = self.sourceViewController;
    [destVC viewWillAppear:YES];

    destVC.view.frame = sourceVC.view.frame;

    [UIView transitionFromView:sourceVC.view
                        toView:destVC.view
                      duration:0.7
                       options:UIViewAnimationOptionTransitionFlipFromLeft
                    completion:^(BOOL finished)
                    {
                        [destVC viewDidAppear:YES];

                        UINavigationController *nav = sourceVC.navigationController;
                        [nav popViewControllerAnimated:NO];
                        [nav pushViewController:destVC animated:NO];
                    }
     ];
}

@end

Ahora, mantenga presionada la tecla de control para configurar cualquier otro tipo de segue, luego conviértalo en un segue personalizado y escriba el nombre de la clase segue personalizada, et voilà!






Links