Mam aplikację na iPhone'a, która używa a UINavigationControllerdo 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 swojejshouldAutorotatemetody. [...] System określa, czy orientacja jest obsługiwana przez przecięcie wartości zwracanej przezsupportedInterfaceOrientationsForWindow:metodę aplikacji z wartością zwracaną przezsupportedInterfaceOrientationsmetodę najwyższego pełnoekranowego kontrolera.
Więc podklasowałem UINavigationController, nadałem mojej MainNavigationControllerwłaściwości boolowskiej landscapeOKi 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 MainNavigationControllerpożą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 viewWillAppearmetodzie 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?


