2012-08-02 3 views

Odpowiedz

51

Aby wyłączyć orientację dla określonego kontrolera widoku, należy teraz zastąpić supportedInterfaceOrientations i preferredInterfaceOrientationForPresentation.

- (NSUInteger) supportedInterfaceOrientations { 
    // Return a bitmask of supported orientations. If you need more, 
    // use bitwise or (see the commented return). 
    return UIInterfaceOrientationMaskPortrait; 
    // return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; 
} 

- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation { 
    // Return the orientation you'd prefer - this is what it launches to. The 
    // user can still rotate. You don't have to implement this method, in which 
    // case it launches in the current orientation 
    return UIInterfaceOrientationPortrait; 
} 

Jeśli kierujesz coś starszego niż iOS 6, chcesz metodę shouldAutorotateToInterfaceOrientation:. Zmieniając, kiedy zwraca tak, będziesz określić, czy będzie on obracać się do wspomnianej orientacji. Pozwoli to tylko na normalną orientację pionową.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // Return YES for supported orientations 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 

    // Use this to allow upside down as well 
    //return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown); 
} 

Zauważ, że shouldAutorotateToInterfaceOrientation: została zaniechana w iOS 6.0.

+2

Jeśli widok oller znajduje się w kontrolerze nawigacyjnym, a następnie w kontrolerze nawigacyjnym należy je wdrożyć. –

+0

@RrRogers Zrobiłem tak, ale to nie działa. Zobacz http://pastebin.com/dLfLLP2j Każdy kontroler poprawnie implementuje supportedInterfaceOrientations. Pierwszy kontroler widoku poprawnie pokazuje portret, nawet gdy aplikacja jest uruchamiana z urządzenia na ekranie głównym iPhone'a Plus. Ale kiedy przechodzę do innego kontrolera, obracaj urządzenie w przód iw tył, aby ustawić drugi kontroler na krajobraz, i powróć, pierwszy kontroler jest teraz w krajobrazie. To, czego chcę, to to, że pierwszy kontroler ma być portretowy, a drugi - cały. –

+0

Proponuję przeniesienie 'NSUinteger' z' supportedInterfaceOrientations' (pierwszej linii kodu) na 'UIInterfaceOrientationMask'. Xcode 8 ostrzega o "Konfliktowym typie zwracania w implementacji" supportedInterfaceOrientations ":" UIInterfaceOrientationMask "(aka" enum UIInterfaceOrientationMask ") a" NSUInteger "(inaczej" unsigned long ")" i wywołuje wrażenie. Dzięki za odpowiedź – GabLeRoux

0

Usunięcie metody shouldAutorotateToInterfaceOrientation ze swojej klasy również całkowicie działa. Jeśli nie planujesz rotacji, nie ma sensu mieć metody w klasie, im mniej kodu, tym lepiej.

+0

Ta odpowiedź jest już nieaktualna; 'shouldAutorotateToInterfaceOrientation' jest przestarzałe od lat. –

+0

@MarkAmery https://developer.apple.com/reference/uikit/uiviewcontroller/1621419-shouldautorotate nie ma powiadomienia o wycofaniu. –

+0

@VaddadiKartick Jest to również inna metoda niż wymieniona w tej odpowiedzi; Nie jestem pewien, o co ci chodzi. –

28

Xcode 4 i poniżej

dla tych, którzy go brakowało: Można użyć ekranu ustawień projektu, aby ustalić kierunki całej aplikacji (nie ma potrzeby, aby zastąpić metody w każdym kontrolerze):

enter image description here

To tak proste, jak przełączanie obsługiwanych orientacji interfejsu. Możesz znaleźć, klikając swój projekt w lewym panelu> kartę docelową aplikacji> kartę Podsumowanie.

+0

To jest przestarzałe; interfejs użytkownika jest teraz inny. –

35

Xcode 5 i powyżej

  • Kliknij projektu w projekcie Navigator w lewym panelu, aby otworzyć ustawienia projektu
  • przejdź do zakładki General.
  • Odznacz opcje, których nie chcesz w Deployment Info sekcji, pod Orientacja Device

screenshot showing where to click

+1

Nie mogę odznaczyć opcji Krajobraz na kopalni. Natychmiast je włącza. Ponadto, jeśli usunę je z listy Info.plist, odkłada je. – Almo

0

Swift 3 Jeśli masz navigationController, podklasa to tak (tylko w trybie portretowym):

class CustomNavigationViewController: UINavigationController { 

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
    return UIInterfaceOrientationMask.portrait 
    } 

    override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { 
    return UIInterfaceOrientation.portrait 
    } 
}