Höhe und Breite auf dem iPhone (/ iPad)

8

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).

    
Jonathan. 19.10.2010, 19:33
quelle

7 Antworten

17

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).

    
Tim Isganitis 22.10.2010, 21:07
quelle
10

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.

    
Deniz Mert Edincik 22.10.2010 11:02
quelle
6

Verwenden Sie die Grenzen der Ansicht

    
tadejsv 26.10.2010 09:30
quelle
4

Fenster gibt immer die Größe für die Hochformatausrichtung an. Immer.

Aber die Ansichten darauf geben die richtigen Maße (bezüglich der Ausrichtung), also stellen Sie sicher, dass Sie diese verwenden.

    
tadejsv 19.10.2010 20:09
quelle
3

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.

    
Nimrod 19.10.2010 19:55
quelle
3

Hier ist, was ich getan habe, um das zum Laufen zu bringen:

  • Stellen Sie in der Info.plist sicher, dass diese Parameter vorhanden sind:
    • Anfängliche Schnittstellenausrichtung = Querformat (rechte Home-Taste)
    • Unterstützte Schnittstellenorientierungen
      • Eintrag 0 = Landschaft (rechte Maustaste)
      • Menüpunkt 1 = Landschaft (linke Home-Taste)
  • Fügen Sie einen XIB-basierten View-Controller mit einer Ansicht hinzu, die die Größe automatisch ändert (das Problem der Größenänderung beseitigen usw.)
    • Hinweis Ich habe hier einen Navigations-Controller mit einem View-Controller verwendet, weil es praktisch war, aber ich denke, das sollte auch mit einem einzelnen VC funktionieren.

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.

    
ImHuntingWabbits 28.10.2010 08:00
quelle
0

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

    
Brett 21.02.2011 07:50
quelle