Mam aplikację na iPhone'a, która używa a UINavigationController
do prezentowania interfejsu szczegółowego: najpierw jeden widok, potem drugi, aż do czterech poziomów głębokości. Chcę, aby pierwsze trzy widoki były ograniczone do orientacji pionowej i tylko ostatni widok powinien mieć możliwość obrócenia do poziomu. Wracając z czwartego widoku do trzeciego, a czwarty widok był w orientacji poziomej, chcę, aby wszystko wróciło do pionu.
W iOS 5 po prostu zdefiniowałem shouldAutorotateToInterfaceOrientation:
w każdym z moich kontrolerów widoku, aby zwracać TAK dla dopuszczalnych orientacji. Wszystko działało zgodnie z opisem powyżej, w tym powrót do portretu, nawet jeśli urządzenie było trzymane w orientacji poziomej podczas powrotu z kontrolera widoku # 4 do # 3.
W iOS 6 wszystkie kontrolery widoku obracają się do poziomu, łamiąc te, które nie były przeznaczone. W informacjach o wydaniu iOS 6 jest napisane
Większa odpowiedzialność przenosi się na aplikację i jej delegata. Teraz kontenery iOS (takie jak
UINavigationController
) nie konsultują się ze swoimi dziećmi w celu ustalenia, czy powinny one wykonywać autorotowanie. [...] System pyta najwyżej położony kontroler widoku pełnoekranowego (zwykle kontroler widoku głównego) o obsługiwane orientacje interfejsu za każdym razem, gdy urządzenie się obraca lub gdy kontroler widoku jest prezentowany w trybie prezentacji pełnoekranowej. Ponadto obsługiwane orientacje są pobierane tylko wtedy, gdy ten kontroler widoku zwraca wartość YES ze swojejshouldAutorotate
metody. [...] System określa, czy orientacja jest obsługiwana przez przecięcie wartości zwracanej przezsupportedInterfaceOrientationsForWindow:
metodę aplikacji z wartością zwracaną przezsupportedInterfaceOrientations
metodę najwyższego pełnoekranowego kontrolera.
Więc podklasowałem UINavigationController
, nadałem mojej MainNavigationController
właściwości boolowskiej landscapeOK
i użyłem tego do zwrócenia dopuszczalnych orientacji w supportedInterfaceOrientations
. Następnie w każdej z viewWillAppear:
metod kontrolerów widoku mam taką linię
[(MainNavigationController*)[self navigationController] setLandscapeOK:YES];
powiedzieć mojemu MainNavigationController
pożądanemu zachowaniu.
Pojawia się pytanie: jeśli teraz przejdę do mojego czwartego widoku w trybie portretowym i obrócę telefon, obróci się on do poziomu. Teraz naciskam przycisk Wstecz, aby wrócić do mojego trzeciego widoku, który powinien być tylko portretem. Ale nie obraca się z powrotem. Jak mam to zrobić?
próbowałem
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]
w viewWillAppear
metodzie mojego trzeciego kontrolera widoku, ale nic nie robi. Czy to niewłaściwa metoda wywołania, czy może niewłaściwe miejsce, aby to wywołać, czy też powinienem zaimplementować całość w zupełnie inny sposób?