2010-04-21 11 views
38

In meiner iPhone OS-Anwendung möchte (muss) ich auf Änderungen in der Geräteausrichtung achten, um bestimmte Teile des Bildschirms neu anzuordnen. Der Ansatz, den ich verwendete, war, CGRect frame = [UIScreen mainScreen].applicationFrame zu verwenden, um die Bildschirmgröße zu erhalten, und von dort die Größe und/oder Positionierung anderer Kontrollen zu berechnen (ich versuchte auch self.view.frame)."Falsche" Frame/Fenstergröße nach Neuausrichtung in iPhone

Alle Tests wurden bisher im Portrait-Modus durchgeführt, sodass ich mich auf die Programmierung der Hauptfunktionen konzentrieren konnte und später einige Anpassungen für Landscape vornehmen konnte. Und hier tritt das Problem auf: In -(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation habe ich etwas Logging hinzugefügt, um die Größen zu überprüfen, bevor ich fortfahre, aber anscheinend sind die Werte für Breite und Höhe "falsch" (ich sage "falsch", weil auf den ersten Blick die Werte für mich keinen Sinn ergeben)).

Hier ist der Ausgang einiger Protokollierung:

  • Rotation: Landschaft [w = 300,000000, h = 480,000000]
  • Rotation: Portrait [w = 320,000000, h = 460,000000]

Die Werte für "w" und "h" in Landscape scheinen mir invertiert zu sein - ich habe erwartet, dass w = 480 und h = 300 sind.

Was mache ich falsch? Der Code, mit dem ich debuggte, ist unten.

-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    CGRect frame = [UIScreen mainScreen].applicationFrame; 
    CGSize size = frame.size; 

    NSLog(@"%@", [NSString stringWithFormat:@"Rotation: %s [w=%f, h=%f]", 
     UIInterfaceOrientationIsPortrait(self.interfaceOrientation) ? "Portrait" : "Landscape", 
     size.width, size.height]); 
} 
+0

hhmm ... wenn ich 'self.view.bounds 'benutze (wenn man bedenkt, dass" self.view "die Hauptansicht ist, wo andere Unteransichten hinzugefügt werden), bekomme ich die erwarteten Werte. Jetzt bekomme ich dieses Verhalten Ich erinnere mich an etwas, das sie in der Standford iPhone Dev Kurs in iTues U gesprochen haben, aber ich bin mir nicht sicher, ob es verwandt ist. Wie auch immer, ich möchte noch eine konkretere Meinung haben. –

+0

Seltsamerweise funktioniert 'self.view.frame' auch gut, wenn Sie einen Navigationscontroller haben, aber wenn nicht, sieht es so aus, als müssten Sie' self.view.bounds' verwenden. – Rob

Antwort

33

Die Ausrichtung Ihres Geräts hat sich geändert, nicht die physischen Eigenschaften des Bildschirms. Sie haben es im Grunde genommen auf die Seite gekippt, aber in Wirklichkeit ist es 320 Pixel breit (20 davon stehen Ihnen zur Zeit nicht zur Verfügung, da die Statusleiste angezeigt wird) und 480 Pixel groß. Wenn sich Ihre Ansicht automatisch dreht, wurde die Breite/Höhe für Sie übersetzt, aber wenn Sie nach den tatsächlichen Abmessungen des Bildschirms fragen, erhalten Sie die tatsächlichen Abmessungen des Bildschirms zurück.

Aus diesem Grund ist es auch beim Arbeiten mit übersetzten Ansichten wichtig, Berechnungen basierend auf dem Mittelpunkt der Ansicht und den Grenzen der Ansicht durchzuführen und niemals auf dem Rahmen der Ansicht.

+4

Die übersetzte Ansicht (durch automatisches Drehen) wirkt sich nicht auf den Rahmen der Ansicht aus. Kannst du mehr erklären oder weißt du den Link zu diesem Prinzip? ich bin verwirrt. Danke im Voraus. – user1705636

18

Ich bin über das gleiche Problem gestolpert und mit einigen Diagnosearbeiten habe ich festgestellt, dass die Grenzen und der Rahmen der Ansicht nicht genau die Querformatausrichtung in viewDidLoad widerspiegeln (wenn das Gerät im Querformat gehalten wird, wenn der Ansichtscontroller gedrückt wird) der Stapel), aber tun Sie das richtig in viewWillAppear: und viewDidAppear:. Ich habe gerade meinen Code bewegt, der die Abmessungen des Rahmens/der Grenzen von viewDidLoad zu viewWillAppear: benötigt, und es funktionierte ordnungsgemäß.

+0

Ich habe Arbeitscode, der dies hier anspricht: [Wie orientierungsabhängige Höhe und Breite des Bildschirms bekommen?] (Http: // stackoverflow.com/questions/7905432/How-to-Get-Orientierung abhängig-Höhe und Breite des Bildschirms/7905540 # 7905540). Vielleicht haben Sie schon lange keine Probleme mehr damit, aber wenn nicht, hoffe ich, dass es hilft. – Sam

27

Verwenden Sie stattdessen self.view.bounds.

+0

Vorsicht mit diesem. Es ist großartig, wenn die Größe der aktuellen Ansicht das ist, was Sie wirklich wollen, aber es ersetzt nicht [UIScreen mainScreen] .applicationFrame, weil es die Höhe der Statusleiste nicht berücksichtigt. – Axeva

+0

Immer noch der falsche Wert. Breite und Höhe sind falsch. Muss umgedreht werden. – openfrog

+0

Dies funktionierte für mich auf iOS 7, gab mir die korrekte neue Größe in willAnimateRotationToInterfaceOrientation. – malhal

Verwandte Themen