2012-10-10 11 views
7

Dla mojej aplikacji rootViewController jest navgationController.iOS 6 - (BOOL) shouldAutorotate nie zostanie wywołane dla kontrolerów nawigacji wciśniętych viewControllers

stwierdziliśmy, że popchnął kontrolera

-(BOOL)shouldAutorotate nie nazywa uzyskiwanie.

i

-(NSUInteger)supportedInterfaceOrientations uzyskać wywołana tylko raz.

Sprawdziłem poprawnie w podsumowaniu projektu xcode's (lub plist) dla systemu Windows obsługującego wszystkie orientacje.

Chcę nich metoda nazywa się, jak jest jakaś uicontrol kod pozycjonowania, które chcę wykonać programowo do zmiany orientacji.

I rozwiązać ten problem poprzez nadpisanie (kategoria) kontrolera nawigacyjnego następujących metod

-(BOOL)shouldAutorotate; 

-(NSUInteger)supportedInterfaceOrientations; 

Sprawdziłem który kontroler jest wciśnięty i odpowiednio nazywane odpowiednimi popchnął kontrolera uicontrol kod pozycjonowania w następujący sposób panelu nawigacyjnego za

(NSUInteger)supportedInterfaceOrientations; 

To działa dobrze, ale nie sądzę, że to jest poprawny sposób. Pomóż mi znaleźć lepsze rozwiązanie.

+0

W moim przypadku (jak pisał http://stackoverflow.com/questions/12610132/multiple-uiinterfaceorientations-app-with-ios-6) nie był w stanie radzić sobie z presentModalViewControllers, ale pushViewController działał dobrze – jMelnik

Odpowiedz

0

można sprawdzić za pośrednictwem interfejsu orientacji

[UIApplication sharedApplication].statusBarOrientation 

gdy kontroler widoku jest załadowany, powiedzmy, w viewWillAppear. Tam możesz zrobić układ subviews. Gdy widok się podniesie, shouldAutorotate zostanie wywołany po każdym obróceniu urządzenia.

+0

Ale mind you supportedInterfaceOrientations będą wywoływane tylko raz –

+0

Nie, przepraszam. Właśnie przetestowałem to na świeżym projekcie. Ilekroć się obracam, obie metody są wywoływane dokładnie raz. – Mundi

0

Zastępowanie UINavigationController jest to najlepsze rozwiązanie, ale nie jestem pewien, czy jesteś sprawdzanie kontrolerów Push supportedInterfaceOrientations właściwy sposób.

Spójrz na moją odpowiedź tutaj: https://stackoverflow.com/a/12669343/253008

+0

Nie Sprawdzam obsługiwane kontrolery PushInterfaceOrientations we właściwy sposób. Wszystko działa poprawnie zgodnie z oczekiwaniami. Po prostu chcę wiedzieć, czy istnieje jakaś alternatywa dla znalezionego rozwiązania (nadpisywanie metod), tak aby pchane kontrolery - (BOOL) powinnyAutorować; - (NSUInteger) supportedInterfaceOrientations; zostanie wywołany automatycznie po każdej zmianie orientacji. Więc mogę pominąć sprawdzanie, który kontroler jest pchany i wywołując jego kod repozycjonowania UIControl odpowiednio z overriden metody. Ponieważ ten kod repozycjonowania UIControl znajduje się już w metodach orientacyjnych kontrolerów. –

27

Można sprawdzić poniższy link, musisz utworzyć niestandardową nawigację do wspierania powinny auto obracać

http://mobileappdevpage.blogspot.in/2012/11/how-to-use-should-autorotateios-6-with.html

Drugi sposób można to zrobić tworzenie kategorii UINaviagationController

kod

do pliku .h jest

@interface UINavigationController (autorotation) 

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

i kod dla pliku .m jest

@implementation UINavigationController (autorotation) 

-(BOOL)shouldAutorotate 
{ 

    UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation; 
    [self.topViewController shouldAutorotate]; 
    return YES; 

} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskAll; 

} 
@end 
+0

Jest to bardzo bardzo przydatna wiadomość dla mnie. Dzięki Yaar –

+0

miło również rozwiązany problem z wykorzystaniem tego dziękuję ... –

+0

@iMobile i Neel dzięki –

1

I również w obliczu tego samego problemu z kontrolerem nawigacyjnym.To działa dobrze w przypadku wszystkich pchane widok kontrolerów, ale mój scenariusz był zupełnie inny miałem jeden viewcontroller wsunięty do kontrolera nawigacji (ViewControllerParent) jako root,

NavController 
      -- rootViewController (ViewControllerParent) 
              --- ViewControllerChild1 
              --- ViewControllerChild2 

Z powodu jakiegoś wymogu projektu, I utrzymywał obiekt ViewControllerParent jako podstawowy, a następnie dodawałem widok kontrolera widoku podrzędnego jako subviews do obiektu nadrzędnego na podstawie działań użytkownika. Teraz miałem scenariusz, w którym chciałem, aby Child1 się nie obracał, a Child2 - rotację.

Problem, z którym miałem do czynienia, polegał na tym, że mój [self.topViewController] w klasie kontrolerów nawigacyjnych zawsze zwraca mi obiekt nadrzędny, ponieważ nie wysyłam Childs do stosu nav. Zatem moje metody'Autorotate w moich Childs nigdy nie będą wywoływane. Musiałem więc sprawdzić klasę w metodzie shouldAutorotate mojego rodzica, a następnie zwrócić wartość rotacji. zrobiłem coś takiego w klasie nadrzędnej (ViewControllerParent), jest to rodzaj obejścia ale Naprawiono problem

-(BOOL)shouldAutorotate 
{ 
    BOOL allowRotation = YES; 

    if ([currentlyLoadedChild isKindOfClass:[Child1 class]]) 
    { 
     allowRotation = NO; 
    } 
    if ([currentlyLoadedChild isKindOfClass:[Child2 class]]) 
    { 
     allowRotation = YES; 
    } 
    return allowRotation; 
} 

-anoop

0

miałem ten sam problem. sprawdzić this answer Jego wielkie approauch zamiast stosowania ShouldAutoRotate

Powiązane problemy