2010-10-19 4 views
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, legen Sie die unterstützten Orientierungen nur auf die Landschaft in der info.plistHöhe und Breite auf dem iPhone (/ iPad)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
[application setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft]; 

// Override point for customization after application launch. 
UIAlertView *test = [[UIAlertView alloc] initWithTitle:@"hu" message:@"hui" delegate:nil cancelButtonTitle:@"hi" otherButtonTitles:nil]; 
[test show]; 
[window makeKeyAndVisible]; 
    NSLog(@"win %f - %f", window.bounds.size.width, window.bounds.size.height); 
return YES; 
} 

Ohne die erste Zeile, die die Statusleiste Orientierung einstellt, erscheint die Warnung Ansicht im Portrait obwohl der Rest der Schnittstelle in der Landschaft links ist: und dann den folgenden Code hinzu.

Wie auch immer die Log gibt immer noch diese:

win 768.000000 - 1024.000000 

Dies ist falsch herum (und damit, wenn ich Subviews in meiner realen Anwendung hinzufügen die Rahmen sind nicht korrekt)

Apple scheint wirklich zu haben Mucked auf der Schnittstelle Rotation, weil ich nichts als Probleme hatte, erinnere ich mich nicht daran, dass dies passiert auf dem iPhone, also bitte kann mir jemand sagen, wie das zu beheben.

Ich gebe 500 Reputation (das ist alles außer 10 von meinem Ruf) an die Person, die zumindest erklären kann, warum das passiert und hoffentlich eine Lösung bieten.

+0

Welche SDK-Version verwenden Sie? – ImHuntingWabbits

+0

Warum machst du das in der AppDelegate? Um das zu umgehen, erstelle ich einen BOOL im AppDelegate, der Falsch ist, bis diese Methode aufgerufen wird, wo sie sich auf TRUE ändert. Dann starte ich in der viewWillLoad in meinem MainVC einen Timer, der überprüft ob die AppDelegate BOOL TRUE ist. Wenn es ist, feuere ich die Methode, die den Alarm anzeigt. Um es schöner zu machen, zeige ich auch das Standardbild auf meinem MainVC, bis die Nachricht erscheint. Das mag ein hacky Ansatz sein, aber ich muss nicht immer die Alarmansicht anzeigen, also überprüfe ich das auch. –

Antwort

17

ich denke, die "Launching in Landscape Mode" der iOS Application Programming Guide meist erklärt, was mit Ihrer Testanwendung geschieht:

Anwendungen in iOS normalerweise in Portrait-Modus starten Sie die Ausrichtung des Home-Bildschirms anzupassen. Wenn Sie eine Anwendung, die sowohl in der Mode Porträt und Landschaft läuft, Ihre Anwendung sollte immer im Portrait-Modus startet zunächst und dann seine Ansicht Controller die Schnittstelle drehen lassen als auf das des Geräts Orientierung benötigt wird. Wenn Ihre Anwendung in Landscape-Modus läuft nur, aber Sie müssen die folgenden Schritte durchführen es in einer Landschaft Orientierung starten machen zunächst:

  • In Ihrer Anwendung Info.plist Datei, fügen Sie die UIInterfaceOrientation Schlüssel und setzen Sie seinen Wert auf den Landschaftsmodus. Für Querformatausrichtungen können Sie den Wert dieses Schlüssels auf UIInterfaceOrientationLandscapeLeft oder UIInterfaceOrientationLandscapeRight festlegen.

  • Legen Sie Ihre Ansichten im Querformatmodus dar und stellen Sie sicher, dass die Autorisierungsoptionen richtig eingestellt sind.

  • überschreiben, um Ansicht des Controller ShouldAutorotateToInterfaceOrientation: Verfahren und das Rück JA nur für das gewünschte Querformat und NO für Porträtausrichtungen.

Wichtig: Die vorhergehenden Schritte setzen voraus, Ihre Anwendung verwendet View-Controller seiner Ansicht Hierarchie zu verwalten. View Controller bieten eine signifikante Menge an Infrastruktur für die Handhabung von Orientierung Änderungen sowie andere komplexe Sicht-Ereignisse. Wenn Ihr Anwendung nicht Ansicht unter Verwendung Controller-wie es der Fall mit Spiele und andere OpenGL ES-basierte sein anwendungs ​​Sie sind verantwortlich für die Zeichenfläche drehen (oder Anpassung Ihrer Zeichenbefehle) als benötigt präsentieren Ihr Inhalt in Landscape-Modus.

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 das Fenster angepasst 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 realen App erreichen möchten, aber die empfohlene Vorgehensweise besteht darin, Ihre Ansichten für Hochformat auszurichten und dann ihre Autoresierungseigenschaften für die automatische Rotation festzulegen (unabhängig davon, ob sie unmittelbar nach der Anwendung erfolgt) Start oder später).

+0

Wirklich gute Antwort, also werde ich es akzeptieren und eine weitere Prämie (nicht von 500, wenn: \\) starten, wenn ich kann und es Ihnen zuerkannt werde, aber persönlich bevorzuge ich Deniz 'Antwort, damit er das Kopfgeld bekommt. Du erklärst gut, warum es im Allgemeinen passiert, was für mich wirklich nützlich ist und ob ich jetzt das Kopfgeld teilen könnte. –

+0

Das iPad ist eine Ausnahme von der Regel, weil es Home-Bildschirm zu Landschaft drehen kann. – bentford

3

Anstatt die Statusleiste manuell zu ä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 eine Art "Low Level". Ihre View-Controller müssen außerdem UIInterfaceOrientationLandscapeLeft in der Instanzmethode zurückgeben.

+0

Bitte lesen Sie meine Frage :) Sie würden denken, was Sie vorschlagen, würde funktionieren, aber es nicht. –

+0

Duh sorry darüber – Nimrod

+0

Warum hast du keine UIViews? Sie sollten immer einen Container UIView in Ihrem Fenster haben, soweit ich weiß. Sie platzieren Widget-Ansichten nicht direkt in das Fenster oder Sie? – Nimrod

4

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

Aber die Ansichten darauf geben die richtigen Maße (in Bezug auf die Orientierung), also stellen Sie sicher, diese zu verwenden.

+0

Ich habe das gerade gemacht, und nun ändert sich der Unterschied in der Statusleiste (20 Pixel) korrekt, aber die Breite und Höhe werden nicht geändert. –

+0

Die Breite ist immer noch wie 768 in der Landschaft (die Höhe des Bildschirms in der Landschaft ist 1024) und umgekehrt im Portrait –

+0

Verwenden Sie die Grenzen, nicht den Rahmen der Ansicht, um die richtigen Koordinaten – tadejsv

10

UIWindow weiß nichts über Rotation. Rotationsmethoden sind in UIViewController gekapselt. (Auto-Rotationen usw.)

UIAlertView verwendet UIApplication statusBarOrientation Eigenschaft, um die Ausrichtung des Alerts auszuwählen.

// Rotate to a specific orientation. This only rotates the status bar and updates the statusBarOrientation property. 
// This does not change automatically if the device changes orientation. 
@property(nonatomic) UIInterfaceOrientation statusBarOrientation; 

Wie Sie aus SDK-Header sehen können, ist statusBarOrientation nicht automatisch geändert. Entweder du oder UIViewController (automatische Rotation) sollte diese Eigenschaft ändern.

Wenn Sie Portrait beginnen (die mit UIWindow der Standardausrichtung konsistent ist), und verwenden Sie ShouldAutorotateToInterfaceOrientation und lassen UIViewController Rotation zu handhaben, es ändert sich UIApplication des statusBarOrientation auf jedem Gerät Orientierungsänderung. Wenn Sie im Querformat starten, sollten Sie statusBarOrientation einmal manuell einstellen.

Hoffe, das hilft.

+1

Vielen Dank für die Erklärung der Begriffe von UIAlertView und zu sagen, was ich tun soll. –

+0

Ich habe so lange versucht, dies zu lösen, bevor ich diese Lösung gefunden habe. Putting [[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animiert: NO]; wie die erste Zeile meiner LoadView die Arbeit gemacht hat. Vielen Dank! – Andy

+0

Ich glaube, ich habe gerade 2 Stunden verloren, als ich versuchte, meine iPad App (iOS5) nur im Querformat zu starten. Das funktioniert, vielen Dank. – Jasper

6

Verwenden Sie die Grenzen der Ansicht

3

Hier ist, was ich tat dies, um an die Arbeit:

  • Im Info.plist, stellen Sie sicher, dass diese Parameter haben:
    • Initial-Schnittstelle Ausrichtung = Querformat (rechte Home - Taste)
    • Unterstützte Schnittstellenorientierungen
      • Element 0 = Querformat (rechts Home-Taste)
      • Artikel 1 = Landschaft (links Home-Taste)
  • hinzufügen xib basierte View-Controller, mit dem Ziel darin, dass das Auto komprimiert die Größe (die Größe neu bestimmt Problem beseitigen, etc.)
    • Hinweis Ich habe hier einen Navigationscontroller mit einem View-Controller verwendet, weil es praktisch ist, aber ich denke, dass dies auch mit einem einzelnen VC funktionieren sollte.

ein wenig Code zu AppDelegate hinzufügen:

_rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil]; 
_navigationController = [[UINavigationController alloc] initWithRootViewController:self.launcherViewController]; 
[window addSubview:self.navigationController.view]; //I think this is the key. 
[window makeKeyAndVisible]; 

ich glaube, der Schlüssel der Ansicht ist, versuchte ich es ohne sie und auf dem iPhone es funktionierte ganz gut, auf dem iPad obwohl die Warnung im Hochformat angezeigt wurde, wie Sie sagen. Als ich die Ansicht hinzugefügt habe, wurde die Warnung im Querformat wie gewünscht angezeigt.

0

Ich hatte nichts als Probleme Hardcoding meiner App auf Landscape nur Modus. 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 beim Drucken korrekt erscheinen.

Anyways eine lange Geschichte kurz zu schneiden, ich meine plist von UIInterfaceOrientationLandscapeLeft zu UIInterfaceOrientationLandscapeRight verändert und verändert auch meine UIViewController Methode:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
} 

Und alle gingen meine Probleme 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, wenn das Ihr Problem behebt