2012-02-16 13 views
14

Tengo una animación personalizada de segue que se produce cuando se empuja un nuevo controlador de vista a la pila. Sin embargo, al mostrar el controlador de vista que se presentó con dicha transición personalizada, se produce la animación predeterminada del controlador de navegación (es decir, el controlador de vista actual se anima hacia la derecha mientras el controlador de vista principal se traduce en pantalla desde el borde izquierdo).Reversión de Segue personalizada con Storyboarding

Así que mi pregunta es esta: ¿hay alguna manera de escribir una animación de transición de pop personalizada que ocurre cuando se saca un controlador de vista de la pila?

Editar (solución):

que terminó definiendo una costumbre segue similar a la respuesta seleccionada. En el guión gráfico, arrastré una transición personalizada desde el controlador de vista secundaria a su elemento primario, le di un identificador y el segmento inverso recién escrito como su clase. Sí, me doy cuenta de que es prácticamente idéntica a una transición modal. Los requisitos del cliente necesitaban esta locura, así que antes de que alguien comente, comprenda que sé que uno no debería tener que hacerlo en circunstancias normales.

- (void)perform { 
    UIViewController *src = (UIViewController *)self.sourceViewController; 
    UIViewController *dest = (UIViewController *)self.destinationViewController; 

    [UIView animateWithDuration:0.3 animations:^{ 
    CGRect f = src.view.frame; 
    f.origin.y = f.size.height; 
    src.view.frame = f; 

    } completion:^(BOOL finished){ 
    src.view.alpha = 0; 
    [src.navigationController popViewControllerAnimated:NO]; 
    }]; 
} 
+0

Así que para ser claro, en realidad está invirtiendo el segue a medida, que está usando en su lugar un segue personalizado independiente para volver? – sobri

+3

Al utilizar un segue looping a sí mismo, ¿no estás creando otra instancia del controlador de vista original innecesariamente? Supongo que nadie se daría cuenta a excepción de un breve blip en un perfil de memoria. :) – qix

Respuesta

19

Sí. Aquí hay un ejemplo en el que aparezco en el nivel superior. Cuando creas el segue en Storyboard. Use select o ingrese la nueva nueva clase segue en el inspector de atributos.

// 
// FlipTopPop.h 

#import <UIKit/UIKit.h> 


@interface FlipTopPopToRoot : UIStoryboardSegue 

@end 

y

// FlipTopPop.m 

#import "FlipTopPopToRoot.h" 

@implementation FlipTopPopToRoot 

- (void) perform { 

    UIViewController *src = (UIViewController *) self.sourceViewController; 
    [UIView transitionWithView:src.navigationController.view duration:0.5 
        options:UIViewAnimationOptionTransitionFlipFromBottom 
       animations:^{ 
        [src.navigationController popToViewController:[src.navigationController.viewControllers objectAtIndex:0] animated:NO];; 
       } 
        completion:NULL]; 
} 

@end 

Si desea que aparezca un solo cambio de nivel de utilizar este segue personalizado:

// PopSegue.h 

#import <UIKit/UIKit.h> 

@interface PopSegue : UIStoryboardSegue 

@end 

y

// PopSegue.m 

#import "PopSegue.h" 

@implementation PopSegue 

- (void) perform { 

    UIViewController *src = (UIViewController *) self.sourceViewController; 
    [src.navigationController popViewControllerAnimated:YES]; 
} 

@end

+0

PopSegue debe ser parte de UIKit. ¡Bueno! – Eric

+0

Esto crea/desasigna un nuevo controlador de vista de destino innecesariamente. Sería mejor no usar un Segue y en su lugar solo abrir el controlador de vista. Sí, estoy de acuerdo: Apple debería incluir soporte para una seguación pop. – mdupls

+0

Me gustó la solución para PopToRoot, pero la de pop solo una vista ... no mucho. he añadido un poco de algo por lo que cuando se necesita para volver sólo uno todavía existe la animación: - (void) {realizar UIViewController * src = (UIViewController *) self.sourceViewController; [UIView transitionWithView: src.navigationController.view duración: 0.5 opciones: UIViewAnimationOptionTransitionCrossDissolve animaciones:^{ [src.navigationController popViewControllerAnimated: NO]; } finalización: NULL]; } – ChavirA

0

Como señaló el comentador Linus, las otras soluciones presentadas crearán otra instancia del UIViewController. Creo que este enlace aquí describe otras alternativas para habilitar animaciones segue inversas.

http://robsprogramknowledge.blogspot.com/2012/05/back-segues.html

+1

El artículo habla acerca de pasar información de un controlador de vista a su controlador de vista padre, nada sobre animación o transición en absoluto. – b123400