iPhone App im Querformat, 2008 Systeme

98

Bitte beachten Sie, dass diese Frage aus dem Jahr 2008 stammt und jetzt nur noch von historischem Interesse ist.


Was ist der beste Weg, um eine iPhone-Anwendung zu erstellen, die von Anfang an im Querformat ausgeführt wird, unabhängig von der Position des Geräts?

Sowohl programmgesteuert als auch mit dem Interface Builder.

Michiel de Mare
quelle
5
Für zukünftige Leser beachten Sie bitte, dass dieses berühmte Problem ab 2011 von Apple gelöst wird . Beachten Sie das Testprojekt in der Antwort unten.
Fattie

Antworten:

47

Nur historische Antwort. Spektakulär veraltet.

Bitte beachten Sie, dass diese Antwort jetzt sehr veraltet ist.

Diese Antwort ist nur eine historische Kuriosität .


Aufregende Neuigkeiten! Wie Andrew unten herausgefunden hat, wurde dieses Problem von Apple in 4.0+ behoben.

Es scheint, dass es NICHT mehr erforderlich ist, die Größe der Ansicht für jede Ansicht zu erzwingen, und das spezifische ernsthafte Problem der Landschaft "nur beim ersten Mal funktioniert" wurde gelöst.

Ab April 2011 ist es nicht möglich, etwas unter 4.0 zu testen oder gar zu bauen, daher ist die Frage eine rein historische Kuriosität. Es ist unglaublich, wie viel Ärger es Entwicklern so lange bereitet hat!


Hier ist die ursprüngliche Diskussion und Lösung. Dies ist jetzt völlig irrelevant, da diese Systeme nicht einmal bedienbar sind.


Es ist EXTREM SCHWIERIG, diese Funktion vollständig auszuführen - es sind mindestens drei Probleme / Fehler im Spiel.

Versuchen Sie dies .. Interface Builder Landschaftsgestaltung

Beachten Sie insbesondere, dass dort, wo "und Sie solltenAutorotateToInterfaceOrientation überall richtig verwenden" steht, überall Ihre Vollbildansichten angezeigt werden.

Hoffe es hilft in diesem Albtraum!

Eine wichtige Erinnerung an das ZUSÄTZLICHE bekannte Problem, das hier vorliegt : Wenn Sie versuchen, zwischen MEHR ALS EINER Ansicht (alle Landschaften) zu wechseln, FUNKTIONIERT ES EINFACH NICHT . Denken Sie unbedingt daran, sonst verschwenden Sie Tage mit dem Problem. Es ist buchstäblich nicht möglich. Es ist der größte offene, bekannte Fehler auf der iOS-Plattform. Es gibt buchstäblich keine Möglichkeit, die Hardware so zu gestalten, dass die zweite Ansicht, die Sie laden, im Querformat angezeigt wird. Die nervige, aber einfache Problemumgehung und das, was Sie tun müssen, ist ein trivialer Master-UIViewController, der nichts anderes tut, als dort zu sitzen und Sie zwischen Ihren Ansichten wechseln zu lassen.

Mit anderen Worten, in iOS wegen eines großen bekannten Fehlers:

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

Sie können das nur einmal tun . Wenn Sie später versuchen, happyThing.view zu entfernen und stattdessen newThing.view dort einzufügen, FUNKTIONIERT ES NICHT - UND DAS IST DAS. Die Maschine dreht die Ansicht niemals in die Landschaft. Es gibt keine Trickkorrektur, auch Apple kann es nicht zum Laufen bringen. Die Problemumgehung, die Sie anwenden müssen, besteht darin, einen allgemeinen UIViewController zu haben, der einfach dort sitzt und nur Ihre verschiedenen Ansichten enthält (happyThing, newThing usw.). Ich hoffe es hilft!

Fattie
quelle
2
Ich glaube, dies wurde in 4.x behoben. Wir haben ein Spiel ausgeliefert, das eine Reihe verschiedener Bildschirme, einige Quer- und einige Hochformat-Bildschirme hatte und in 3.x einfach nicht funktionierte. Wir wollten nicht in die zusätzliche Dummy-Ansicht, um damit fertig zu werden, sondern benötigten stattdessen 4.x - was ein Jahr nach dieser Frage wahrscheinlich in Ordnung ist.
AndrewS
Wir haben nicht "immer Landschaft" gemacht, sondern unterschiedlich Landschaft oder Porträt. Jeder VC wird direkt zum Fenster hinzugefügt und daraus entfernt. App startet Landschaft, bleibt so durch mehrere Bildschirmübergänge. Wir verwenden keine Dummy-Ansicht, aber wir überschreiben SollteAutorotate in jedem Bildschirm. Keine Probleme mit 4.x, vom Touch über das Pad bis zum Telefon.
AndrewS
41

Von der Apple Dev Site:

Um Ihre Anwendung im Querformat zu starten, sodass sich die Statusleiste sofort an der entsprechenden Position befindet, bearbeiten Sie Ihre Info.plist-Datei, um den Schlüssel UIInterfaceOrientation mit dem entsprechenden Wert (UIInterfaceOrientationLandscapeRight oder UIInterfaceOrientationLandscapeLeft) hinzuzufügen, wie in Listing 2 gezeigt.

Listing 2: Starten Sie Ihre Anwendung im Querformat

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>
Michael Pryor
quelle
5
Dieses Plus in Ihren shouldAutorotateToInterfaceOrientation-Methoden return (interfaceOrientation! = UIInterfaceOrientationPortrait); und du bist fertig.
Michael Behan
5
In der Frage wird gefragt, wie das Gerät im Querformat gestartet werden soll. Die Antworten geben diese Informationen. Die Handhabung der Orientierung danach wird in der Frage nicht erwähnt. +1 Michael Pryor
ingh.am
1
Interessanterweise startet die "Antwort" das Gerät tatsächlich NICHT im Querformat - !! Es ist wahrscheinlich der bekannteste Fehler / die bekannteste Schwierigkeit in der gesamten Apple-Umgebung. Es ist eine Basis für sehr arbeitende iPad-Entwickler!
Fattie
@mbehan Es gibt auch UIInterfaceOrientationPortraitUpsideDown, daher kein Fix. Darüber hinaus wird UIInterfaceOrientation in .plist nur auf Geräten ab Version 3.2 unterstützt, nicht auf Geräten ab Version 3.1.3 (und denken Sie daran, dass das iPhone 2G in dieser Version nicht funktioniert).
Ivan Vučica
28

Zusammenfassung und Integration aller Beiträge, nachdem ich sie selbst getestet habe; Überprüfen Sie das Update für 4.x, 5.x unten.

Ab 3.2 können Sie die Ausrichtung einer laufenden Anwendung nicht mehr anhand von Code ändern.

Sie können eine Anwendung jedoch mit einer festen Ausrichtung starten, obwohl dies nicht einfach ist.

Versuchen Sie es mit diesem Rezept:

  1. Stellen Sie Ihre Ausrichtung UISupportedInterfaceOrientationsin der Info.plistDatei auf ein
  2. Definieren Sie in Ihrem Fenster einen 480x320 "Base View Controller". Jede andere Ansicht wird als Unteransicht zu ihrer Ansicht hinzugefügt.
  3. In allen View-Controllern wird die shouldAutorotateToInterfaceOrientation:Methode eingerichtet (um natürlich den gleichen Wert zurückzugeben, den Sie in der Liste definiert haben).
  4. In allen Ansichts-Controllern wird eine Hintergrundansicht mit festgelegt

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

    in der viewDidLoadMethode.

Update (iOS 4.x, 5.x) : Das Apple iOS App-Programmierhandbuch enthält einen Abschnitt "Starten im Querformat" im Kapitel "Erweiterte App-Tricks".

Verweise:

IlDan
quelle
1
Ich kann bestätigen, dass dies die einzige wirklich funktionierende Lösung ist (mit einem kleinen Zusatz). Ich habe Stunden gebraucht, um dies zu finden und zu bewerten. Alle anderen Antworten sind nur Teillösungen des Problems.
Johannes Rudolph
8

Zuerst habe ich in info.plist gesetzt

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

dann habe ich diesen Code in applicationDidFinishLaunching eingefügt:

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)]; 

Auf diese Weise kann ich die Ansicht im Interface Builder im Querformat bearbeiten.

Samvermette
quelle
7

Die Antwort von sasb und michaelpryor scheint richtig zu sein, aber wenn es bei Ihnen nicht funktioniert, versuchen Sie diese Alternative:

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

Oder dieses:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

Oder dieses:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

Möglicherweise müssen Sie auch window makeKeyAndVisible;zuerst anrufen .

Einige Links: Entwicklung im Querformat , iPhone SDK: Wie erzwinge ich nur den Querformatmodus?

@ Robert: Weitere Informationen finden Sie unter iPhone SDK, NDA und Stack Overflow .

Sören Kuklau
quelle
6

Ich bin überrascht, dass noch niemand diese Antwort gefunden hat:

In all meinen Tests wird beim Entlassen eines Modal View Controllers die bevorzugte Ausrichtung des übergeordneten View Controllers shouldAutorotateToInterfaceOrientationberücksichtigt, auch wenn er Teil eines UINavigationControllers ist. Die Lösung hierfür ist also einfach:

Erstellen Sie einen Dummy-UIViewController mit einer UIImageView als Hintergrund. Stellen Sie das Image auf das default.png-Image ein, das Ihre App beim Start verwendet.

Wenn Sie viewWillAppearin Ihrem Root-View-Controller aufgerufen werden, präsentieren Sie einfach den Dummy-View-Controller ohne Animation.

Wenn Sie viewDidAppearin Ihrem Dummy-View-Controller aufgerufen werden, schließen Sie den View-Controller mit einer netten Cross-Dissolve-Animation.

Das funktioniert nicht nur, es sieht auch gut aus! Übrigens, nur zur Verdeutlichung mache ich den Root View Controller viewWillAppearwie folgt:

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

Das neueste Programmierhandbuch für iPhone OS enthält einen vollständigen Abschnitt mit Beispielcode. Ich bin mir sicher, dass dies eine neue Ergänzung ist. Vielleicht haben Sie sie verpasst. Es werden alle Bedingungen erläutert, die Sie erfüllen müssen. Grundsätzlich...

  • Legen Sie die Info.plist-Eigenschaften fest (dies ändert die Position der Statusleiste, nicht jedoch die Ansicht).
  • Drehen Sie Ihre Ansicht manuell um die Mitte, entweder auf Ihrer UIViewController viewDidLoad: -Methode oder Ihrer applicationDidFinishLaunching: -Methode, oder implementieren Sie die automatische Drehung ("Verhalten beim automatischen Ändern der Größe", Seite 124).

Suchen Sie nach "Starten im Querformat", Seite 102.


quelle
4

Siehe diese Antwort: Querformat NUR für iPhone oder iPad

  1. Fügen Sie der Plist Orientierung hinzu
  2. shouldAutorotateToInterfaceOrientation = YES in allen Dateien

Wenn Sie jedoch gemischte Modi verwenden, sind Sie möglicherweise besser dran

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
nicc
quelle