2010-05-19 10 views
18

Pisałem mój uniwersalnym zastosowaniu w trybie portretowym, i teraz po około 15 nib plików, wielu, wielu viewCotnrollers, Chciałbym wdrożyć shouldAutorotateToInterfaceOrientation i zaprojektować kilka ekranów w trybie poziomym.shouldAutorotateToInterfaceOrientation nie działa

dodając:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
return YES; 
} 

do wszystkich moich viewControllers, nie do pracy.

Podczas debugowania widzę, że ta metoda jest wywoływana, ale po prostu nie zadziała! nie w symulatorze, nie w urządzeniu, nie w Iphone, nie w iPadzie!

Rozglądałem kilka odpowiedzi na forum, i zobaczyłem jakiś radzi używać:

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

Nie pracował też,

dodając:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

i

[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; 

do mojego widokuDidLo reklamy i viewDidUnload odpowiednio też nie działały.

Zgubiłem się .. Każda pomoc może zrobić!

Jeszcze tylko jedna informacja ... wszystkie moje widoki są typu UIControl, ponieważ potrzebowałem TuchUpInside do pracy.

Wyróżnij swoją pomoc.

+0

Jakie wersje urządzeń i/lub symulatorów widzisz na tym urządzeniu? Jaki jest typ kontrolera głównego lub paska kart? – warrenm

+0

Xcode 3.2.2, symulator dla iphone 3.1.3, (ipad 3.2) i korzystanie z urządzenia 3.1.3. Mam zarówno pasek tabulacji, jak i kontroler nawigacyjny w pliku mainWindow Nib. ale wszystkie moje klasy są podklasami UIViewController –

+0

ktoś? coś? –

Odpowiedz

44

Upewnij się, że wszystkie widoki nadrzędne mają autoodkrywanieWyswietlaczy = TAK. Może zajść potrzeba zrobienia tego w kodzie, jeśli nie ustawiłeś sprężyn i rozpórek w IB dla wszystkich widoków.

Cytowanie Podręczniku konstruktora Interface użytkownika:

Ważne: w pliku nib Cocoa, jeśli nie określają żadnych sprężyny lub rozpórki dla widoku interfejsu Builder ale następnie używaj setAutoresizingMask: Metoda dodawania zachowania automatycznego w środowisku wykonawczym , Twój widok może nadal nie być zgodny z , zachowaniem autouzyskującym . Powodem jest to, że interfejs Builder wyłącza automatyczne całkowanie dzieci nadrzędnych widoku rodzica , jeśli te dzieci nie mają ustawionych sprężyn i zestawów podpór . Aby ponownie włączyć funkcję automatycznego synchronizowania, musisz przekazać TAK do w widoku nadrzędnym dla metody setAutoresizesSubviews: z poziomu . W takim przypadku widoki podrzędne powinny być poprawnie autosynchronizowane.

kilka innych rzeczy, aby być świadomym:

  1. UINavigationController AutoRotate będzie tylko wtedy, gdy kontroler widoku korzeń jest także zestaw do AutoRotate.

  2. Kontrolka UITabBarController będzie autorotować tylko wtedy, gdy wszystkie kontrolery widoku zostaną ustawione na autorotację.

+4

"Kontrolka UITabBarController będzie autorotować tylko wtedy, gdy wszystkie kontrolery widoku zostaną ustawione na autorotację." --- dostaje mnie za każdym razem; jest to po prostu zły sposób na wdrożenie interfejsu API przez Apple. Mam nadzieję, że pewnego dnia to naprawią. – Adam

+0

+1 to zwięźle i całkowicie wytłumaczy niestandardowe zachowanie każdemu, kto tworzy "normalną aplikację" z kontrolerami nav i tabbar - zrobiło to dla mnie i działa. Na marginesie, aplikacja zbudowana za pomocą nav-kontrolerów wewnątrz paska zakładek w IB otrzyma poprawny kontroler root, a domyślne podpórki, autosize i ustawienia orientacji widoku podczas tworzenia kontrolerów view są w porządku, więc nie ma potrzeby ustawiania ani poprawiania żadnego z nich. –

+0

"Kontrolka UITabBarController będzie autorotować tylko wtedy, gdy wszystkie kontrolery widoku zostaną ustawione na autorotację." !!!! (powtarza się :). Wydaje się, że tak nie jest w przypadku iOS 6 i nowszych wersji, ale jest na iOS 5 (był bardzo zdezorientowany przez zachowanie). –

2
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    UIInterfaceOrientation des=self.interfaceOrientation; 

    if(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad) //iPad 
    { 
     if(des==UIInterfaceOrientationPortrait||des==UIInterfaceOrientationPortraitUpsideDown)//ipad-portairait 
     { 

     } 
     else//ipad -landscape 
     { 

     } 
    } 
    else//iphone 
    { 
     UIInterfaceOrientation des=self.interfaceOrientation; 

     if(des==UIInterfaceOrientationPortrait||des==UIInterfaceOrientationPortraitUpsideDown) //iphone portrait 
     { 

     } 
     else //iphone -landscape 
     { 

     } 
    } 
return YES; 
} 
+0

Dziękujemy za edytowanie. –

0

miałem ten problem, ale to działało w iOS6 ale nie iOS5. Okazuje się, że w moim scenorysie miałem widok, że nie stworzyłem jeszcze klasy kontrolera viewcontroller.

0

... i nie mniej ważne, upewnij się, że nie aktywowałeś ustawienia "Orientacja pionowa zablokowana" na twoim urządzeniu testowym (oczywiście nie dotyczy to symulatora), to wyłącza obracanie w dowolnej aplikacji bez względu na to, co zwróci shouldAutorotateToInterfaceOrientation.

1

Których iOS budujesz? Był przestarzały w iOS 6.0. (Należy zastąpić supportedInterfaceOrientations i metod preferredInterfaceOrientationForPresentation zamiast.)

Ponadto można nazwać shouldAutorotate od klasy UIViewController:

https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/shouldAutorotate


zapewnić Państwu sprawdzone obsługiwanych orientacje interfejsu w „Summery "zakładka ustawień projektu (Wybierz nazwę projektu w" Nawigatorze projektu "na samej górze).

Jeśli nie wybrano orientacji, której chcesz użyć, symulator/iphone nie pozwoli na zmianę orientacji ekranu.