2011-11-24 11 views
14

Ho due UIViewControllers contenuti in un controller della vista di navigazione e entrambi in modalità orizzontale. Voglio passare tra due controller uiview senza avere un'animazione come push. Pertanto eseguo una sequenza personalizzata tra questi due se l'utente fa clic sul primo viewcontroller su un pulsante.ios: Segmento personalizzato tra due viewcontrollers in modalità orizzontale

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

@class AppDelegate; 

@interface NonAnimatedSegue : UIStoryboardSegue { 

} 

@property (nonatomic,assign) AppDelegate* appDelegate; 

@end 

E questo l'attuazione:

#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 

nello storyboard sono passato a segue personalizzato e in realtà funziona benissimo. L'unico problema è che il secondo controllore uiview non viene visualizzato in modalità orizzontale ma in protrait. Se rimuovo il seguito personalizzato e lo sostituisco con un push segue, allora tutto funziona bene, il secondo viewcontroller viene visualizzato in modalità orizzontale.

Quindi, cosa devo fare in modo che anche il secondo viewcontroller sia in visualizzazione orizzontale se utilizzo la mia sequenza personalizzata?

risposta

14

Il codice sopra riportato non funziona perché destinationViewController non può ricevere aggiornamenti da UIInterfaceOrientation a se stante. Riceve gli aggiornamenti tramite il suo "Container View Controller" (il controller di navigazione). Per far funzionare correttamente la sequenza personalizzata, è necessario passare alla nuova visualizzazione tramite il Navigation Controller.

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

Sei un bellissimo essere umano. –

1

si può avere il controller vista di destinazione prende il centro/Trasforma/limiti dal controller di origine (che è già orientata correttamente):

-(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; 
} 
Problemi correlati