objective c - unwind - Inversión de Custom Segue con Storyboarding
swift unwind segue programmatically (3)
Tengo una animación de transición personalizada 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).
Así que mi pregunta es la siguiente: ¿hay alguna forma de escribir una animación de transición pop personalizada que ocurra al sacar un controlador de vista de la pila?
Editar (solución):
Terminé definiendo una transición personalizada 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];
}];
}
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 mostrar 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];
}
@fin
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
Para cualquiera que siga esto ahora, iOS 7 te permite animar en ambos sentidos:
Establezca la transición a Push, luego vea el código a continuación para una implementación push.
https://github.com/Dzamir/OldStyleNavigationControllerAnimatedTransition