2010-04-19 6 views
21

Probleme, die richtigen Grenzen für meine iPad-Anwendung bekommen, wenn es im Landschaftsmodus zu starten. Ich habe die richtigen Tasten gesetzt in meiner Info.plist-Datei, und meine Ansicht-Controller starten richtig in Landschaft (und Porträt, natch).UIScreen Application Rückkehr falsches Rechtecks ​​auf Landschaft Anwendung zu starten (iPhone/iPad)

In meiner applicationDidFinishLaunching: Methode rufe ich einen Selektor nach einer Verzögerung von 3 Sekunden, und diese Methode ruft [[UIScreen mainScreen] applicationFrame], aber es gibt mir ein Porträt-Frame (dh Höhe> Breite).

Kann jemand das beheben? Es riecht wie ein Bug zu mir (wenn also werde ich ein Radar-Datei), aber wenn es das Verhalten bestimmt ist, wo es dokumentiert?

+16

Kann ich von nun an einfach "inkorrektes Winkel" sagen? – jbrennan

Antwort

6

Wenn Sie das iPad halten in Ausrichtung Landschaft und starten Sie eine App, die View-Controller zunächst Grenzen für ein Porträt Blick sieht (obwohl Orientierung Berichte Landschaft). Der View-Controller erhält dann eine Meldung, die in Querformat gedreht wird, bevor sie angezeigt wird.

+0

Nachdem die Nachricht zum Drehen an den View-Controller gesendet wurde, spiegelt das Koordinatensystem die neue Ausrichtung wieder? Zum Beispiel, nachdem die Nachricht gesendet wird, Breite> Höhe? –

5

Das ist so konzipiert. Sie sollten die Größe Ihrer Superview abfragen und gegebenenfalls anpassen.

+0

Könnten Sie erklären, warum dies so aussieht (oder zumindest spekulieren)? Es erscheint mir unlogisch, falsche Grenzen für den Bildschirm anzugeben, wenn er gedreht wurde. Die fragliche "Superview" ist das Fenster meiner Anwendung (und ich habe versucht, den Frame auch zu den gleichen Ergebnissen zu verwenden). – jbrennan

+0

Der Grund ist, dass Fenster unabhängig vom Bildschirm gedreht werden können. Beispiel: Wenn eine Porträtanwendung ein YouTube-Video startet, bleibt das Hauptfenster im Hochformat, aber ein Landschaftsfenster wird darüber animiert. Soll das Gerät während der Animation als Porträt oder Landschaft betrachtet werden? (Die Ausrichtung des Beschleunigungsmessers ist getrennt von der Orientierung des Fensters, getrennt von der Ausrichtung der Statusleiste) – rpetrich

+0

Ich habe das auch bemerkt, es ist wirklich komisch. Danke für die Köpfe hoch. – Justin

35

verlasse ich mich nie auf [[UIScreen mainScreen] applicationFrame], vor allem während der App-Start.

Wenn Ansichten in Code erstellen, verwenden Sie die Superview Ihren Rahmen zu setzen.

Wenn Sie mit xibs mit „simulierten Interface-Elemente“ werden sie richtig dimensioniert sein und alles wird groß arbeiten.

UINavigationController basierte Anwendungen

Im Falle einer UINavigationController basierte Anwendung, greifen den Rahmen direkt von self.navigationController.view, versuchen Sie nicht [self loadView] und self.view.superview zu verwenden. UINavigationController verwendet „versteckt“ Subviews es Arbeit zu tun - so die direkte Superview wird nicht funktionieren.

UINavigationController ist etwas Besonderes, weil während der App-Start, die Navigationssteuerung Ihre Ansichten ändert die Größe nach loadView aufgerufen wird. Wenn die Autoresizer-Funktion aktiviert wird, erscheint am unteren Bildschirmrand ein kleiner Rand.

Warum UIScreen nicht

[[UIScreen mainScreen] applicationFrame] nicht zuverlässig (beim App-Start vor allem in der Landschaft) funktioniert. Meine Erfahrung ist, dass das interfaceOrientation Eigenschaft Viewcontroller wird die applicationFrame Orientierung nicht überein.

+0

Das ist so wichtig! Danke – coco

+0

Das ist sehr hilfreich! Hätte ich es früher gefunden, hätte ich viel Zeit gespart! Vielen Dank! – coder284

6

Dies ist die Art, wie ich die richtige CGRect erhalten, wenn die View-Controller auf Landschaft ist:

CGRect landscapeBounds; 
if (self.view.frame.size.width < self.view.frame.size.height) 
    landscapeBounds = CGRectMake(self.view.frame.origin.y, self.view.frame.origin.x, self.view.frame.size.height, self.view.frame.size.width); 
else 
    landscapeBounds = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height); 
0

ich in gleiche Problem bekam, wenn sie mit dismissViewControllerAnimated in Cordova Plugin Ansicht zurückgewiesen. I modifizierte singingAtom Code für viewWillAppear Verfahren in Mainviewcontroller, die nach Entlassung modale Ansicht der Größe verändert wurde:

- (void)viewWillAppear:(BOOL)animated 
    { 
    CGRect appFrame = [[UIScreen mainScreen] applicationFrame]; 
    UIDeviceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; 
    if (UIDeviceOrientationLandscapeLeft == orientation || 
     UIDeviceOrientationLandscapeRight == orientation) 
      { 
      if (appFrame.size.width < appFrame.size.height) 
       { 
       appFrame = CGRectMake(appFrame.origin.y, appFrame.origin.x, appFrame.size.height, appFrame.size.width); 
       } 
     } 
    self.view.frame = appFrame; 
    [super viewWillAppear:animated]; 
} 
14
CGRect bounds = [[UIScreen mainScreen] bounds]; // portrait bounds 
if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) { 
    bounds.size = CGSizeMake(bounds.size.height, bounds.size.width); 
} 
1

Also, ein Startbild hinzufügen und das Suffix -568h geben, nach Apples Führer.

Ich verstehe nicht, warum jemand mit einem gesunden Verstand eine Systemeinstellung von einer Grafik abhängig machen würde; aber ich habe es gerade getestet und es hat funktioniert.

Here is the spot that taught me after a quick search Ich habe diese Antwort oben nicht gesehen, dachte, es wäre nützlich für jemanden.

S

2

[[UIScreen mainScreen] applicationFrame] wird das Porträt Rechteck immer zurück, auch wenn die App im Querformat ist. Dies hängt damit zusammen, dass UIWindowniemals tatsächlich rotiert, sondern nur die Transformation von rootViewController.view ändert.

sicher zu gehen, können Sie die Stammansicht Objekt in Hoch- und Querformat drucken, und Sie werden etwas sehen:

Porträt:

<UIView: 0x96290e0; frame = (0 20; 768 1004); ... 

Landschaft:

<UIView: 0x96290e0; frame = (0 20; 768 1004); transform = [0, 1, -1, 0, 0, 0]; ...