Pregunta

Tengo una animación Segue personalizada que ocurre al empujar un nuevo controlador de vista a la pila. Sin embargo, al hacer estallar el controlador de vista que se presentó con dicho Segue personalizado, la animación de controlador de navegación predeterminada ocurre (es decir, el controlador de vista actual se anima a la derecha mientras el controlador de vista principal se traduce en pantalla desde el borde izquierdo).

Entonces, mi pregunta es esta: ¿hay alguna manera de escribir una animación de Segue Pop personalizada que ocurra al aparecer un controlador de vista fuera de la pila?

Editar (solución):

Terminé definiendo un segue personalizado similar a la respuesta seleccionada. En el guión gráfico, arrastré un segue personalizado desde el controlador de visión infantil a su padre, le di un identificador y la recientemente escrita segue inversa como su clase. Sí, me doy cuenta de que es prácticamente idéntico a una transición modal. Los requisitos del cliente requirieron esta locura, por lo que antes de que alguien comienta, entienda 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];
  }];
}
¿Fue útil?

Solución

Sí. Aquí hay un ejemplo en el que salgo al nivel superior. Cuando creas el Segue en Storyboard. Use Seleccione o ingrese la 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 aparecer, solo un cambio de nivel, use 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];
}

@final

Otros consejos

Para cualquiera que siga esto ahora, iOS 7 te permite animar en ambos sentidos:

Establezca el Segue para empujar, luego vea el código a continuación para obtener una implementación push.

https://github.com/dzamir/oldstylenavigationControlleranimatedTransition

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top