2011-11-24 11 views
14

Mam dwa kontrolery UIView, które są zawarte w kontrolerze nawigacyjnym i oba w trybie poziomym. Chcę przełączać się między dwoma kontrolerami uiview bez animacji takiej jak push. Dlatego wykonuję niestandardową zmianę między tymi dwoma, jeśli użytkownik kliknie pierwszy przycisk kontrolny widoku.ios: Custom Segue między dwoma kontrolerami widoku w trybie poziomym

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

@class AppDelegate; 

@interface NonAnimatedSegue : UIStoryboardSegue { 

} 

@property (nonatomic,assign) AppDelegate* appDelegate; 

@end 

I to realizacja:

#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 

W serii ujęć przeszedłem do niestandardowego segue i faktycznie to działa dobrze. Jedynym problemem jest to, że drugi kontroler uiview nie jest wyświetlany w trybie poziomym, ale w trybie protrait. Jeśli usunę niestandardowy segue i zastąpię go segmentem push, wtedy wszystko działa poprawnie, drugi viewcontroller wyświetla się w trybie poziomym.

Co muszę zrobić, aby drugi kontroler widoku był również w widoku poziomym, jeśli używam niestandardowego segue?

Odpowiedz

14

Powyższy kod nie działa, ponieważ obiekt docelowyViewController nie może samodzielnie otrzymywać aktualizacji z UIInterfaceOrientation. Odbiera te aktualizacje za pośrednictwem "Kontrolera widoku kontenera" (kontrolera nawigacyjnego). Aby niestandardowe przejście do pracy działało prawidłowo, musimy przejść do nowego widoku za pomocą kontrolera nawigacyjnego.

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

Jesteś piękny człowiek. –

1

można mieć widok kontroler docelowy wziąć centrum/przekształcać/granic z kontrolera źródłowego (który jest już zorientowany prawidłowo):

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