2015-08-01 14 views
11

Mam aplikację z 9-10 ekranami. Umieściłem UINavigationController w moim kontrolerze widoku. Mam kilka kontrolerów widoku, które chcę ustawić tylko orientację pionową: oznacza to, że obracanie urządzenia nie powinno obracać tych kontrolerów widoku do trybu poziomego. Próbowałem następujące rozwiązania:Jak wymusić lub wyłączyć orientację interfejsu dla niektórych, ale nie wszystkich kontrolerów UIViewController?

pierwszy:

NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait]; 
    [[UIDevice currentDevice] setValue:value forKey:@"orientation"]; 

ale ekran nadal obraca się do góry.

drugie: Stworzyłem klasę niestandardowy widok kontrolera jako PortraitViewController i dodaje poniższy kod w PortraitViewController.m

@interface PortraitViewController() 
@end 

@implementation PortraitViewController 
- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    //Here check class name and then return type of orientation 
    return UIInterfaceOrientationMaskPortrait; 
} 
@end 

Potem realizowane PortraitViewController.h jako klasy bazowej

#import <UIKit/UIKit.h> 
#import "PortraitViewController.h" 
@interface Login : PortraitViewController 
@end 

Czyni w ogóle nie działa, nadal pozwala kontrolerowi widoku obracać się w trybie poziomym.

Czy istnieje inne rozwiązanie, którego używam iOS 8 & nie chcesz, aby kontroler widoku obracał się w trybie poziomym?

EDIT: Czy to możliwe, aby mieć orientację Pozioma tylko dla niektórych kontrolerów widoku i zmusić inną orientację widoku kontrolerów trzymać się portret?

+0

gdzie napisałeś pierwsze dwie linie? – iAnurag

+0

W ViewDidLoad @ iAnurag – TechGuy

+1

@JulianM opublikował poprawną odpowiedź.Podejmujesz jednak pewne ryzyko związane ze spójnością aplikacji, ponieważ kontrolery ukrytych widoków nie otrzymują komunikatów o zmianach orientacji. Powinieneś rozważyć przeprojektowanie interfejsu i dostrojenie swojego doświadczenia użytkownika, – SwiftArchitect

Odpowiedz

1

Musisz to zrobić ręcznie. Wszystkie kontrolery widoku, w których nie chcesz obracać widoku, implementują następującą metodę.

- (BOOL)shouldAutorotate 
{ 
    return NO; 
} 
+0

Czy muszę ustawić delegata do korzystania z tej metody? – TechGuy

+0

Nie działa dla mnie? @Sweet – TechGuy

+0

Nie trzeba ustawiać delegata, jest to metoda klasy 'UIViewController'. – VRAwesome

7

Spróbuj podklasy UINavigationController używasz ponieważ domyślna UINavigationController nie przekazuje metody shouldAutorotate do ty viewcontroller.

Wdrożenie następującą metodę w swojej UINavigationController podklasy

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

Teraz UINavigationController przekazuje wywołanie metody do obecnej widoczne UIViewController więc trzeba wdrożyć shouldAutorotate tam indywidualnie, aby uzyskać pożądany efekt.

5

Twój PortraitViewController jest OK i nie znam konfiguracji twojego Storyboard. W waszym przypadku ważne jest, aby umieścić docelowy kontroler widoku w innym nowym kontrolerze nawigacyjnym, a następnie ustawić jego klasę na swój PortraitViewController i zaprezentować tę nawigację modalnie, tak jak zrobiłem to poniżej obrazu i działa zgodnie z oczekiwaniami.

enter image description here

If you want to show animation that will make presentation animation like push animation

Poniżej jest moje PortrateNavigation podklasa UINavigationController

PortrateNavigation.h

#import <UIKit/UIKit.h> 

@interface PortrateNavigation : UINavigationController 

@end 

PortrateNavigation.m

#import "PortrateNavigation.h" 

@implementation PortrateNavigation 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 

- (BOOL)shouldAutorotate { 
    return YES; 
} 

- (UIInterfaceOrientationMask)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskPortrait; 
} 

@end 
3

Tworzenie kategorii na UINavigationController i zastąpić supportedInterfaceOrientations

#import "UINavigationController+Orientation.h" 

@implementation UINavigationController (Orientation) 

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

-(BOOL)shouldAutorotate 
{ 
    return YES; 
} 

@end 

Kiedy Wbudowany UINavigationController, Kontenery nie pytaj swoje dzieci, czy obrócić lub nie

5

spróbuj dodać tej metody wraz z shouldAutorotate i supportedInterfaceOrientations

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { 
//Setting the orientation of the view. I've set it to portrait here. 
return UIInterfaceOrientationPortrait; 

}

Ponadto można skorzystać z tej [UIViewController attemptRotationToDeviceOrientation] Tak, aby obrócił się do żądanej nowej orientacji

0

Jeśli chcesz tymczasowo wyłączyć automatyczną rotację, unikaj manipulowanie maskami orientacji, aby to zrobić. Zamiast tego należy zastąpić metodę shouldAutorotate na początkowym kontrolerze widoku. Ta metoda jest wywoływana przed wykonaniem dowolnej autorotacji. Jeśli zwróci NIE, to obrót zostanie wyłączony.

Musisz więc wykonać podklasę "UINavigationController", zaimplementować opcję Zapamiętaj i użyj swojej kontrolki nawigacji w swoim scenorysie.

- (BOOL)shouldAutorotate 

{ 

id currentViewController = self.topViewController; 


if ([currentViewController isKindOfClass:[DetailViewController class]]) 
    return NO; 

return YES; 

}

alternatywny podejście można znaleźć na

http://www.sebastianborggrewe.de/only-make-one-single-view-controller-rotate/

1

Tr to w kontrolerze widoku

- (BOOL)shouldAutorotate{ 
    return NO; 
} 

- (NSUInteger)supportedInterfaceOrientations{ 
    return UIInterfaceOrientationPortrait | 
      UIInterfaceOrientationPortraitUpsideDown; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{ 
    return UIInterfaceOrientationPortrait; 
} 
1

1) Dokonaj zmiennej bool w AppDelegate .

2) Następnie skopiuj & pasty poniżej kod w AppDelegate.m (modyfikować go jak na swoje wymagania)

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{NSLog(@"%d", [UIDevice currentDevice].orientation) 

if (self.isLandscape == YES) //bool created in first step 
{ 
    return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight; 
} 

return UIInterfaceOrientationMaskPortrait; 
} 

3) Teraz skopiuj & pastę poniższy kod w metodzie viewWillAppear kontrolera widoku, dla którego chce wymusić orientację.

[AppDelegate sharedAppDelegate].isLandscape = YES; //bool created in first step 
NSNumber *value1 = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight]; //change the orientation as per your requirement 
[[UIDevice currentDevice] setValue:value1 forKey:@"orientation"]; 

4) Teraz przed naciśnięciem tego kontrolera widoku należy najpierw ustawić wartość bool. Powiedzmy, że chcesz wcisnąć kontrolkę widoku ABC

[AppDelegate sharedAppDelegate].isLandscape = YES; 
[self.navigationController pushViewController:<ABC view controller instance> animated:NO]; 

Mam nadzieję, że to pomoże!

+0

Czy typem zwracanym "supportedInterfaceOrientationsForWindow:" nie powinien być "UIInterfaceOrientationMask" zamiast "NSUInteger"? –

+0

@ CharlieScott-Skinner Tak. Możesz tam to zapisać. Ale ponieważ definicja sugeruje "typedef NS_OPTIONS (NSUInteger, UIInterfaceOrientationMask)" możesz również wpisać NSUInteger. –

+0

Rzeczywiście :) Wydawało mi się niepotrzebnym ostrzeżeniem dla pogody dla małego zysku ... –

Powiązane problemy