2012-12-14 7 views
7

Mam kontroler widoku głównego, który znajduje się wewnątrz kontrolera UINavigationController. W tym kontrolerze widoku głównego mam przycisk, który przesuwa kontrolkę widoku szczegółów, w której znajduje się widok interfejsu UIWeb. Chcę, aby ten kontroler widoku szczegółów był w trybie poziomym po załadowaniu. Wracając do kontrolera widoku głównego, siłą powraca on do trybu portretu. Mam na to system iOS 6.Sterowanie orientacją sił na iOS 6 w Objective-C

Widziałem inne podobne pytania, ale to nie działa po mojej stronie. Stworzyłem LandscapeViewController który jest podklasą UIViewController gdzie pisałem następujących metod:

#pragma mark - Orientation Methods 
- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscape; 
} 

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

To jest mój kod, gdy wciskam kontroler widok szczegółów:

DetailViewController *detailVC = [[DetailViewController alloc] 
             initWithNibName:@"DetailViewController" 
             bundle:nil]; 

    [self.navigationController pushViewController:detailVC 
             animated:YES]; 

myślę o tym gdzie można podklasuj mój LandscapeViewController na powyższym kodzie, aby działał lub jak poprawnie podklasować i wcisnąć mój kontroler widoku szczegółów. Mogę również zaprezentować mój kontroler widoku szczegółowego modalnie, jeśli kontroler nawigacji nie może przesunąć mojego kontrolera widoku szczegółowości z pionowej na poziomą. Gdzie robię to źle?

+0

To jest dokładnie to, co miałem na myśli: http://stackoverflow.com/questions/11610819/iphone-forcefully-change-orientation-from-portrait-to-landscape-on-navigation?rq = 1 – jaytrixz

Odpowiedz

8

Biorąc pod uwagę: Widok A: Portret tylko - View B: Krajobraz tylko

nie mogłem zrobić to w kontroler nawigacji. Zamiast tego otworzyłem widok modalny z widoku A, aby wyświetlić B i zmusić nowy kontroler nawigacyjny do tego widoku.

Działa to dla mnie w iOS5 +.

Musisz utworzyć kategorię dla kontrolera nawigacji jak ten:

UINavigationController + Rotation_IOS6.h

#import <UIKit/UIKit.h> 

@interface UINavigationController (Rotation_IOS6) 

- (BOOL)shouldAutorotate; 
- (NSUInteger)supportedInterfaceOrientations; 
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation; 

@end 

UINavigationController + Rotation_IOS6.h

#import "UINavigationController+Rotation_IOS6.h" 

@implementation UINavigationController (Rotation_IOS6) 

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

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

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return [self.topViewController preferredInterfaceOrientationForPresentation]; 
} 

@end 

W AppDelegate.m add:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ 
    return UIInterfaceOrientationMaskAll; 
} 

Następnie w Zobacz:

- (BOOL)shouldAutorotate { 
    return YES; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return UIInterfaceOrientationPortrait; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown); 
} 

również w Zobacz otworzyć View B to zrobić:

ViewB *vc = [[ViewB alloc] initWithNibName:@"ViewB" bundle:nil]; 

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:vc]; 

[self presentViewController:navigationController animated:YES completion:nil]; 

I wreszcie, w Wyświetl B

- (BOOL)shouldAutorotate { 
    return YES; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskLandscapeLeft; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return UIInterfaceOrientationLandscapeRight; 
} 

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

Oni trochę wkręcili psa w iOS 6 w związku z tym. Oto, co do tej pory odkryłem:

Po pierwsze, Apple dodał przyciski "Obsługiwane orientacje interfejsu" za pomocą Xcode 4.5. Odpowiada to atrybutowi "Obsługiwane orientacje interfejsu" w pliku _info.plist. Przyciski te muszą być przełączone na właściwe wybory, zanim reszta z nich zadziała. (Jeśli przyciski wydają się nie chcieć przełączać, prawdopodobnie jest to spowodowane tym, że plik info.plist jest zablokowany przez CVS lub inny proces.)

Następnie, właściwość .window.rootViewController musi być ustawiona i musi wskazywać "dół" Zobacz kontroler w stosie. Zasadniczo będzie to kontroler nawigacyjny lub kontroler kart.

Jeśli chce się wyłączyć cały obrót, można to zrobić za pomocą przycisków lub można zaimplementować w "dolnym" sterowniku widoku metodę "shouldAutorotate" i zwrócić NO. (Jeśli metoda zostanie pominięta, domyślną wartością jest TAK.)

Mimo że autorotacja jest wyłączona za pomocą polecenia ToAutorotate, jeśli wyświetlany jest monitor MPMoviePlayerViewController, zostanie ono automatycznie pobrane. Jedynie przełączanie obsługiwanych przycisków orientacji interfejsu zapobiega temu.

Jeśli ktoś chce warunkowo włączyć autorotację innych kontrolerów widoku, robi się bałamutny. Zasadniczo twój "dolny" kontroler widoku musi implementować metodę supportedInterfaceOrientations i zwracać, w oparciu o bieżący topViewController, odpowiednią maskę bitową. Można to zrobić za pomocą procedury, która odpytuje starą metodę "shouldAutorotateToInterfaceOrientation" topViewController, ale jest nieco brzydka. I nawet jeśli ten schemat nie wymaga modyfikacji kodu kontrolera widoku obrotowego, to musisz zmodyfikować VC tylko "pod" obróconym, aby zaimplementować "supportedInterfaceOrientation", albo widok ten zostanie obrócony po powrocie. (Przynajmniej jest to prosta kopia/wklej). Wydaje się, że nikt nie wymyślił lepszego, bardziej ogólnego schematu.