Aplikacja na iPhone'a w trybie poziomym, systemy 2008


98

Proszę zauważyć, że to pytanie pochodzi z 2008 roku i teraz ma jedynie znaczenie historyczne.


Jaki jest najlepszy sposób tworzenia aplikacji na iPhone'a, która od samego początku działa w trybie poziomym, niezależnie od pozycji urządzenia?

Zarówno programowo, jak i przy użyciu Interface Builder.


5
Dla przyszłych czytelników, proszę zauważyć, że ten słynny problem został rozwiązany przez Apple od 2011 roku. Zwróć uwagę na projekt testowy w odpowiedzi poniżej.
Fattie

Odpowiedzi:


47

Tylko odpowiedź historyczna. Spektakularnie nieaktualne.

Należy pamiętać, że ta odpowiedź jest teraz bardzo nieaktualna /

Ta odpowiedź to tylko ciekawostka historyczna .


Ekscytujące wiadomości! Jak odkrył poniżej Andrew, problem ten został rozwiązany przez firmę Apple w wersji 4.0+.

Wydawałoby się, że nie ma już potrzeby wymuszania rozmiaru widoku na każdym widoku, a konkretny poważny problem krajobrazu „działającego tylko za pierwszym razem” został rozwiązany.

Od kwietnia 2011 roku nie można przetestować ani nawet zbudować niczego poniżej 4.0, więc pytanie jest czysto historyczną ciekawostką. To niesamowite, ile kłopotów sprawiało to programistom przez tak długi czas!


Oto oryginalna dyskusja i rozwiązanie. Teraz jest to zupełnie nieistotne, ponieważ te systemy nie działają nawet.


Wykonanie tej funkcji w pełni jest BARDZO TRUDNE - występują co najmniej trzy problemy / błędy w grze.

spróbuj tego .. projektowanie krajobrazu kreatora interfejsów

Zwróć uwagę w szczególności, że tam, gdzie jest napisane „i musisz wszędzie prawidłowo używać shouldAutorotateToInterfaceOrientation” , oznacza to wszędzie, wszystkie Twoje widoki pełnoekranowe.

Mam nadzieję, że pomoże to w tym koszmarze!

Ważne przypomnienie o DODATKOWYM dobrze znanym problemie: jeśli próbujesz przełączać się między WIĘCEJ NIŻ JEDNYM widokiem (cały krajobraz), PO PROSTU NIE DZIAŁA . Należy o tym pamiętać, bo inaczej stracisz dni na problem. To dosłownie NIE MOŻLIWE. Jest to największy otwarty, znany błąd na platformie iOS. Dosłownie nie ma sposobu, aby sprzęt wykonał drugi ładowany widok, czyli krajobraz. Irytującym, ale prostym obejściem jest to, co musisz zrobić, to mieć trywialnego mistrza UIViewController, który nic nie robi, ale siedzi tam i pozwala przełączać się między widokami.

Innymi słowy, w iOS z powodu poważnego znanego błędu:

[window addSubview:happyThing.view];
[window makeKeyAndVisible];

Możesz to zrobić tylko raz . Później, jeśli spróbujesz usunąć happyThing.view i zamiast tego wstawisz tam newThing.view, TO NIE DZIAŁA - I TO TAKIE. Maszyna nigdy nie obróci widoku do poziomu. Nie ma żadnej sztuczki, nawet Apple nie może tego zrobić. Obejście, które musisz zastosować, polega na posiadaniu ogólnego kontrolera UIViewController, który po prostu siedzi tam i po prostu przechowuje różne widoki (happyThing, newThing itp.). Mam nadzieję, że to pomoże!


2
Uważam, że zostało to naprawione w wersji 4.x. Wydaliśmy grę, która miała kilka różnych ekranów, trochę krajobrazu i trochę portretu, i po prostu nie działała w 3.x. Nie chcąc wchodzić do dodatkowego widoku atrapy, aby go obsłużyć, zamiast tego potrzebowaliśmy 4.x - co rok po zadaniu tego pytania prawdopodobnie jest w porządku.
AndrewS

Nie zajmowaliśmy się „zawsze krajobrazem”, ale raczej krajobrazem lub portretem. Każdy VC jest bezpośrednio dodawany i usuwany z okna. Aplikacja uruchamia się w trybie poziomym, pozostaje w tym stanie przez kilka przejść między ekranami. Nie używamy widoku fikcyjnego, ale ZASADNICZYMY go na każdym ekranie. Żadnych problemów na 4.x, od touch do padu po telefon.
AndrewS

41

Z witryny Apple Dev:

Aby uruchomić aplikację w trybie poziomym, tak aby pasek stanu znalazł się natychmiast w odpowiednim miejscu, edytuj plik Info.plist, dodając klucz UIInterfaceOrientation z odpowiednią wartością (UIInterfaceOrientationLcapesRight lub UIInterfaceOrientationLcapesLeft), jak pokazano na liście 2.

Listing 2: Uruchamianie aplikacji w trybie poziomym

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>

5
To plus w metodach shouldAutorotateToInterfaceOrientation return (interfaceOrientation! = UIInterfaceOrientationPortrait); i jesteś skończony.
Michael Behan

5
Pytanie dotyczy sposobu uruchomienia urządzenia w trybie poziomym. Odpowiedzi dostarczają tych informacji. Obsługa orientacji po tym nie jest wspomniana w pytaniu. +1 Michael Pryor
ingh.am

1
Co ciekawe, „odpowiedź” w rzeczywistości NIE uruchomi urządzenia w trybie poziomym - !! Jest to prawdopodobnie najbardziej znany błąd / trudność w całym środowisku Apple. To podstawa dla bardzo pracującego programisty na iPada!
Fattie

@mbehan Istnieje również UIInterfaceOrientationPortraitUpsideDown, więc nie jest to poprawka. Ponadto UIInterfaceOrientation w .plist jest obsługiwana tylko na urządzeniach w wersji 3.2+, a nie na urządzeniach w wersji 3.1.3 i starszych (pamiętaj, że iPhone 2G utknął w tej wersji).
Ivan Vučica

28

Podsumowanie i integracja ze wszystkich postów, po samodzielnym przetestowaniu; sprawdź aktualizację 4.x, 5.x poniżej.

Od wersji 3.2 nie można zmienić orientacji uruchomionej aplikacji z kodu.

Możesz jednak uruchomić aplikację ze stałą orientacją, chociaż nie jest to proste.

Spróbuj z tym przepisem:

  1. ustaw orientację UISupportedInterfaceOrientationsw Info.plistpliku
  2. w oknie zdefiniuj "kontroler widoku podstawowego" 480x320. Każdy inny widok zostanie dodany jako widok podrzędny do jego widoku.
  3. we wszystkich kontrolerach widoku skonfiguruj shouldAutorotateToInterfaceOrientation:metodę (oczywiście aby zwrócić tę samą wartość, którą zdefiniowałeś w pliku plist)
  4. we wszystkich kontrolerach widoku ustawia widok tła za pomocą

    self.view.frame = CGRectMake(0, 0, 480, 320)

    w viewDidLoadmetodzie.

Aktualizacja (iOS 4.x, 5.x) : Podręcznik programowania aplikacji Apple iOS zawiera akapit „Uruchamianie w trybie poziomym” w rozdziale „Zaawansowane sztuczki z aplikacjami”.

Bibliografia:


1
Mogę potwierdzić, że jest to jedyne, naprawdę działające rozwiązanie (z niewielkim dodatkiem). Znalezienie i ocena tego zajęło mi godziny. Wszystkie inne odpowiedzi są tylko częściowymi rozwiązaniami problemu.
Johannes Rudolph

8

Najpierw ustawiłem w info.plist

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>

następnie umieściłem ten kod w applicationDidFinishLaunching:

CGAffineTransform rotate = CGAffineTransformMakeRotation(1.57079633);
[window setTransform:rotate];

CGRect contentRect = CGRectMake(0, 0, 480, 320); 
window.bounds = contentRect; 
[window setCenter:CGPointMake(160.0f, 240.0f)]; 

W ten sposób mogę pracować nad widokiem w Interface Builder w trybie poziomym.


7

Odpowiedź sasba i michaelpryora wydaje się być poprawna, ale jeśli to nie działa, wypróbuj tę alternatywę:

- (void)applicationDidFinishLaunchingUIApplication *)application {
    application.statusBarOrientation = UIInterfaceOrientationLandscapeRight;
}

Albo ten:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

Albo ten:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

Być może będziesz musiał window makeKeyAndVisible;najpierw zadzwonić .

Kilka linków: Programowanie w trybie poziomym , iPhone SDK: Jak wymusić tylko tryb poziomy?

@Robert: zobacz iPhone SDK, NDA i Stack Overflow .


6

Dziwię się, że nikt jeszcze nie wymyślił takiej odpowiedzi:

We wszystkich moich testach, gdy odrzucanie modalnego kontrolera widoku, preferowana orientacja kontrolera widoku nadrzędnego ustawiona w shouldAutorotateToInterfaceOrientationjest honorowana, nawet jeśli jest częścią UINavigationController. Więc rozwiązanie tego jest proste:

Utwórz fikcyjny UIViewController z UIImageView dla tła. Ustaw obraz na default.png, którego aplikacja używa podczas uruchamiania.

Kiedy viewWillAppearzostanie wywołany w głównym kontrolerze widoku, po prostu pokaż fałszywy kontroler widoku bez animacji.

kiedy viewDidAppearzostaniesz wywołany w twoim fałszywym kontrolerze widoku, odrzuć kontroler widoku z ładną animacją rozpuszczania krzyża.

Nie tylko to działa, ale wygląda dobrze! BTW, tylko dla wyjaśnienia robię główny kontroler widoku w viewWillAppearten sposób:

- (void)viewWillAppear:(BOOL)animated
{
 if ( dummy != nil ) {
  [dummy setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
  [self presentModalViewController:dummy animated:NO];
  [dummy release];
  dummy = nil;
 }
...
}

5

Najnowszy podręcznik programowania systemu iPhone OS zawiera pełną sekcję na ten temat wraz z przykładowym kodem. Jestem pewien, że to nowy dodatek, więc może go przegapiłeś. Wyjaśnia wszystkie warunki, które musisz spełnić; gruntownie...

  • ustawić właściwości Info.plist (zmienia to położenie paska stanu, ale nie widok)
  • ręcznie obróć widok wokół jego środka, w metodzie UIViewController viewDidLoad: lub w metodzie applicationDidFinishLaunching: lub zaimplementuj automatyczne obracanie („Zachowania automatycznego zmiany rozmiaru”, strona 124)

Poszukaj „Uruchamianie w trybie poziomym”, strona 102.


4

Zobacz odpowiedź: Tryb poziomy TYLKO dla iPhone'a lub iPada

  1. dodaj orientację do plist
  2. shouldAutorotateToInterfaceOrientation = YES we wszystkich plikach

Chociaż jeśli używasz trybów mieszanych, może Ci się lepiej przydać

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.