2011-11-24 26 views
14

Tengo dos UIViewControllers que están contenidos en un controlador de vista de navegación y ambos en modo apaisado. Quiero cambiar entre dos uiviewcontroller sin tener una animación como push. Por lo tanto, realizo una transición personalizada entre estos dos si el usuario hace clic en el primer controlador de vista en un botón.ios: Segue personalizado entre dos viewcontrollers en modo apaisado

#import <Foundation/Foundation.h> 
#import "AppDelegate.h" 

@class AppDelegate; 

@interface NonAnimatedSegue : UIStoryboardSegue { 

} 

@property (nonatomic,assign) AppDelegate* appDelegate; 

@end 

Y esto la aplicación:

#import "NonAnimatedSegue.h" 

@implementation NonAnimatedSegue 

@synthesize appDelegate = _appDelegate; 

-(void) perform{ 
    self.appDelegate = [[UIApplication sharedApplication] delegate]; 
    UIViewController *srcViewController = (UIViewController *) self.sourceViewController; 
    UIViewController *destViewController = (UIViewController *) self.destinationViewController; 
[srcViewController.view removeFromSuperview]; 
[self.appDelegate.window addSubview:destViewController.view]; 
self.appDelegate.window.rootViewController=destViewController; 
} 

@end 

En el guión gráfico que me pasa a segue a medida y en realidad funciona bien. El único problema es que el segundo uiviewcontroller no se muestra en modo apaisado sino en protrait. Si elimino la segue personalizada y la reemplazo con un segue de inserción, entonces todo funciona bien, el segundo controlador de vista se muestra en modo apaisado.

Entonces, ¿qué tengo que hacer para que el segundo controlador de vista también esté en la vista horizontal si uso mi segue personalizado?

Respuesta

14

El código anterior no funciona porque el destinationViewController no puede recibir actualizaciones de UIInterfaceOrientation por sí mismo. Recibe esas actualizaciones a través de su "Controlador de vista de contenedor" (el Controlador de navegación). Para que la transición personalizada funcione correctamente, debemos hacer la transición a la nueva vista a través del Controlador de navegación.

-(void) perform{ 
    [[[self sourceViewController] navigationController] pushViewController:[self destinationViewController] animated:NO]; 
} 
+3

Usted es un ser humano hermoso. –

1

Puede hacer que el controlador de vista de destino tome el centro/transformar/término desde el controlador de la fuente (que ya está orientada correctamente):

-(void) perform{ 
    self.appDelegate = [[UIApplication sharedApplication] delegate]; 
    UIViewController *src = (UIViewController *) self.sourceViewController; 
    UIViewController *dst = (UIViewController *) self.destinationViewController; 

// match orientation/position 
dst.view.center = src.view.center; 
dst.view.transform = src.view.transform; 
dst.view.bounds = src.view.bounds; 

[dst.view removeFromSuperview]; 
[self.appDelegate.window addSubview:dst.view]; 
self.appDelegate.window.rootViewController=dst; 
} 
Cuestiones relacionadas