Dies ist nur eine Testanwendung. Es gibt nur eine AppDelegate-Klasse, um alles zu erstellen, was ich getan habe, war eine Window-basierte App, setze die unterstützten Orientierungen nur auf die Landschaft in der info.plist und füge den folgenden Code hinzu:
%Vor%Ohne die erste Zeile, die die Ausrichtung der Statusleiste festlegt, wird die Alarmansicht im Hochformat angezeigt, obwohl sich der Rest der Benutzeroberfläche im Querformat befindet.
Jedenfalls gibt das Log noch Folgendes:
%Vor%Das ist falsch herum (und wenn ich Subviews in meiner realen App hinzufüge, sind die Frames nicht korrekt)
Apple scheint die Interface-Rotation wirklich gestört zu haben, weil ich nur Probleme hatte, ich kann mich nicht daran erinnern, dass dies auf dem iPhone passiert ist, also bitte kann mir jemand sagen, wie ich das beheben kann.
Ich werde der Person, die wenigstens erklären kann, warum das passiert, und hoffentlich eine Lösung anbieten, 500 Reputation geben (das sind alles andere als zehn meiner Reputation).
Ich denke, die " Starten im Querformat " von Handbuch für die iOS-Anwendungs-Programmierung erläutert hauptsächlich, was mit Ihrer Testanwendung geschieht:
Anwendungen in iOS starten normalerweise in Hochformat, um der Ausrichtung zu entsprechen des Startbildschirms. Wenn du eine hast Anwendung, die in beiden Portraits ausgeführt wird und Landschaftsmodus, Ihre Anwendung sollte immer im Hochformat starten zunächst und dann seine Sicht Controller rotieren die Schnittstelle als benötigt basierend auf dem Gerät Orientierung. Wenn Ihre Anwendung ausgeführt wird nur im Landscape-Modus muss die folgenden Schritte ausführen Lass es in einer Landschaft starten Orientierung zunächst:
In der Datei Info.plist Ihrer Anwendung Fügen Sie den UIInterfaceOrientation-Schlüssel hinzu und Setzen Sie den Wert auf den Querformat-Modus. Für Landschaftsorientierungen können Sie Setzen Sie den Wert dieses Schlüssels auf UIInterfaceOrientationLandscapeLeft oder UIInterfaceOrientationLandscapeRight.
Legen Sie Ihre Ansichten im Querformat fest und stellen Sie sicher, dass ihre Autorisierung Optionen sind richtig eingestellt.
Überschreibe deinen View-Controller shouldAutorotateToInterfaceOrientation: Methode und gebe YES nur für die gewünschte Landschaftsausrichtung und NEIN für Portraitorientierungen.
Wichtig: Die vorhergehenden Schritte gehen davon aus Ihre Anwendung verwendet View-Controller um seine Ansichtshierarchie zu verwalten. Aussicht Controller bieten eine erhebliche Menge der Infrastruktur für die Handhabung Orientierungsänderungen sowie andere komplexe view-related events. Wenn dein Anwendung verwendet keine Ansicht Controller - wie es bei Spiele und andere OpenGL ES-basierte Anwendungen, für die Sie verantwortlich sind Drehen der Zeichenfläche (oder Anpassen Ihrer Zeichenbefehle) als benötigt, um Ihre Inhalte zu präsentieren Landschaftsmodus.
In Bezug auf Ihre Testanwendung ist der wichtigste Teil der letzte Abschnitt. Sie haben keinen View-Controller, Sie sind also dafür verantwortlich, die Benutzeroberfläche in der von Ihnen gewünschten Ausrichtung einzurichten. Deshalb müssen Sie die Ausrichtung der Statusleiste manuell einstellen.
Ich habe im ersten Absatz gelesen, dass iOS-Apps immer im Hochformat gestartet werden und der Root-View-Controller dann seine Ansicht so ändert, dass sie sofort und ohne Animation an die Geräteausrichtung angepasst wird, sobald sie dem Fenster hinzugefügt wird. Das bedeutet, dass das UIWindow selbst nicht rotiert, so dass seine Dimensionen immer im Hochformat sind (wie tadej5553 gesagt hat). Darüber hinaus werden die Frames aller UIWindow-Unteransichten auch im Hochformat angezeigt (da der Frame immer in den Koordinaten der übergeordneten Ansicht definiert ist). Unabhängig davon, wie Sie das Gerät drehen, wird der Rahmen des Root-View-Controllers immer im Hochformat angezeigt. Da die bounds-Eigenschaft einer Ansicht jedoch anhand ihrer eigenen Koordinaten definiert wird, sollten diese Höhe und Breite die aktuelle Ausrichtung der Ansicht widerspiegeln.
Es ist nicht klar, was Sie mit Ihrer echten App erreichen möchten, aber die empfohlene Vorgehensweise besteht darin, Ihre Ansichten für die Ausrichtung im Hochformat auszulegen und dann ihre Autorisierungseigenschaften für die automatische Rotation festzulegen (unabhängig davon, ob sie unmittelbar nach dem Start der App erfolgt) oder später).
UIWindow weiß nichts über Rotation. Rotationsmethoden sind in UIViewController gekapselt. (Auto Rotationen etc)
UIAlertView verwendet die statusBarOrientation -Eigenschaft von UIApplication, um die Ausrichtung des Alerts auszuwählen.
%Vor%Wie Sie aus SDK-Headern sehen können, ändert sich statusBarOrientation nicht automatisch. Entweder du oder UIViewController (automatische Rotation) sollte diese Eigenschaft ändern.
Wenn Sie das Hochformat starten (was mit der Standardausrichtung von UIWindow übereinstimmt) und shouldAutorotateToInterfaceOrientation verwenden und UIViewController die Drehung zulassen, ändert es bei jeder Änderung der Geräteausrichtung die statusBarOrientation von UIApplication .
Aber wenn Sie im Querformat beginnen, sollten Sie statusBarOrientation einmal manuell festlegen.
Hoffe, das hilft.
Anstatt die Statusleiste manuell zu verändern, versuchen Sie UISupportedInterfaceOrientations
auf UIInterfaceOrientationLandscapeLeft
in Ihrer Datei info.plist zu setzen. Dann sollte die App alle eingerichtet sein, um zu gehen, sobald Sie es starten.
Die manuelle Einstellung der Statusleiste ist "Low Level". Ihre View-Controller müssen außerdem UIInterfaceOrientationLandscapeLeft
in der% inode% -Methode zurückgeben.
Hier ist, was ich getan habe, um das zum Laufen zu bringen:
Fügen Sie Ihrem App-Delegierten ein wenig Code hinzu:
%Vor%Ich denke, der Schlüssel ist die Ansicht, ich habe es ohne es versucht und auf dem iPhone hat es gut funktioniert, auf dem iPad, obwohl die Warnung im Hochformat angezeigt wurde, wie Sie sagen. Wenn ich die Ansicht hinzugefügt habe, wird die im Querformat angezeigte Warnung wie gewünscht angezeigt.
Ich habe nur Probleme gehabt, meine App im Landscape-Modus zu codieren. Viele der Zeit gab es kein visuelles Problem, aber die Tasten in den unteren 20 Pixel konnten nicht ausgewählt werden. Ich habe einen clipToBounds in meinem Haupt-UIWindow erstellt und einen Rahmen auf seiner Ebene hinzugefügt und ich konnte sehen, dass sich das UIWindow in der Statusleiste befand. Ich habe versucht, meine x-Versatz von meinem UIWindow zu 20 (UIWindow ist immer noch in Portrait, seine Inhalte sind Landscape), aber dies bedeutete meine UIControllers um 20 Pixel nach unten verschoben (nicht sicher, warum). Obwohl dies ein anderes Problem für Sie ist, habe ich auch das gleiche Problem wie bei Ihnen gefunden, dass die Grenzen und Rahmen, wenn sie gedruckt werden, korrekt zu sein scheinen.
Wie auch immer, um eine lange Geschichte kurz zu machen, habe ich meine Bibliothek von UIInterfaceOrientationLandscapeLeft zu UIInterfaceOrientationLandscapeRight geändert und auch meine UIViewController-Methode in
geändert %Vor%Und alle meine Probleme sind weg. Viele Male habe ich geschworen, dass es Fehler in Apples Rotationscode gibt, die sich als die Art und Weise herausstellen, wie ich etwas implementiert habe, aber ich denke, dass dies definitiv ein Apple ist.
Lassen Sie mich wissen, ob das Ihr Problem behebt
Tags und Links objective-c iphone ipad interface uiwindow