2013-01-31 19 views
29

Pomoc App: iOS6 +Siła orientacji pionowej podczas pchania z krajobrazu View Controller

Moja aplikacja działa zarówno w pionowym i poziomym. Ale 1 kontroler powinien działać tylko w Portret.

Problem polega na tym, że kiedy jestem w krajobrazie i naciskam kontroler widoku, nowy kontroler obrazu jest również w krajobrazie, dopóki nie obrócę go do portretu. Potem utknął w portret, jak powinien.

Czy zawsze można wyświetlać zdjęcie w pionie? Nawet jeśli jego rodzic naciska na krajobraz?

wszystkie poniższe kod nie pomaga

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]; 

I ten kod działa do czasu, gdy nie jestem popychanie od krajobrazu How to force a UIViewController to Portrait orientation in iOS 6

Odpowiedz

30

Rozwiązałem to dodając następujące wiersze w viewDidLoad

UIViewController *c = [[UIViewController alloc]init]; 
[self presentViewController:c animated:NO completion:nil]; 
[self dismissViewControllerAnimated:NO completion:nil]; 
+1

Potwierdzony, działa! – Chris

+1

+1: Musiałem "wymusić" orientację kontrolera viewcontroller, zanim się pojawił, a to wystarczyło. Chciałbym znać "oficjalną" metodę wymuszania orientacji, ale dopóki to zrobię, użyję tej metody. – brainjam

+2

Jeśli zamierzasz wywoływać widok więcej niż jeden raz, sugeruję dodanie tych linii do viewWillAppear. – ChavirA

3

Najpierw trzeba utworzyć kategorię:

UINavigationController + Rotation_IOS6.h

#import <UIKit/UIKit.h> 

@interface UINavigationController (Rotation_IOS6) 

@end 

UINavigationController + Rotation_IOS6.m:

#import "UINavigationController+Rotation_IOS6.h" 

@implementation UINavigationController (Rotation_IOS6) 

-(BOOL)shouldAutorotate 
{ 
    return [[self.viewControllers lastObject] shouldAutorotate]; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return [[self.viewControllers lastObject] supportedInterfaceOrientations]; 
} 

@end 

Następnie należy wdrożyć te metody w swojej klasie, które mają być tylko krajobraz:

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscape; 
} 

W przypadku używasz UITabBarController, po prostu zastąpić UINavigationController dla UITabBarController. To rozwiązanie sprawdziło się po długich poszukiwaniach! Byłem w takiej samej sytuacji jak teraz!

EDIT

Tak, widziałem swoją próbkę. Musisz wprowadzić pewne zmiany. 1 - Utwórz nową klasę dla kategorii UINavigationController. Nazwij klasę UINavigationController + Rotation_IOS6 (.h i .m) 2 - Nie musisz implementować metody preferredInterfaceOrientationForPresentation. Twoja kategoria powinna wyglądać następująco:

#import "UINavigationController+Rotation_IOS6.h" 

@implementation UINavigationController (Rotation_IOS6) 

-(BOOL)shouldAutorotate 
{ 
    return [[self.viewControllers lastObject] shouldAutorotate]; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return [[self.viewControllers lastObject] supportedInterfaceOrientations]; 
} 

@end 

3 - W klasie chcesz obracać tylko w krajobrazie, to ten w realizacji, dokładnie tak:

// Rotation methods for iOS 6 
- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscape; 
} 

4 - radziłbym także metodę autorotacji dla iOS 5 wewnątrz klasy chcesz w krajobrazie:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight; 
} 
+0

Zrobiłem to samo, ale to nie działa. Stworzyłem próbkę, czy możesz to sprawdzić? https://github.com/tariq235/ForcePortrait – Tariq

+0

Zajrzałem do twojego kodu i są pewne zmiany, które należy zrobić! Edytowałem swoją odpowiedź ... Sprawdź to i powiedz wynik ... – CainaSouza

+1

Cześć, dziękuję za poświęcenie czasu na mój kod źródłowy.Ponieważ potrzebuję drugiego kontrolera w trybie Force Portrait, a nie w trybie Landscape, zmieniłem twój kod MaskLandscape na MaskPortrait. A także zaktualizowałem kod github zgodnie z instrukcjami, ale nadal nie działa. Mój problem polega na tym, że pierwszy kontroler znajduje się w trybie poziomym, a następnie kliknij przycisk nawigacji, a drugi kontroler nie powinien być widoczny w poziomie. Powinien wykonać rotację portretu siły. – Tariq