2015-09-24 17 views
5

Ich habe festgestellt, dass iOS 9 im Vergleich zu früheren Versionen von iOS eine neue Ansicht zeigt. Hier ist eine Ausgabe von self.view.frame in iOS 8.4iOS 9 geänderte Ansicht Lastverhalten

viewDidLoad {{0, 0}, {320, 504}} 
viewWillAppear {{0, 64}, {320, 504}} 
viewDidAppear {{0, 64}, {320, 504}} 

Und hier ist das gleiche gilt für iOS 9

viewDidLoad {{0, 0}, {320, 504}} 
viewWillAppear {{0, 0}, {320, 504}} 
viewDidAppear {{0, 64}, {320, 504}} 

Beachten Sie, dass in viewWillAppear Verfahren iOS 9 die origin von self.view.frame aktualisieren ausfällt.

Dies führt zu bestimmten Problemen in meiner App, z. B. dass die Ansichten anfänglich falsch positioniert sind.

Weiß jemand, ob es beabsichtigt ist oder es ein Defekt ist? Und vielleicht eine schnelle Lösung?

+0

Warum diese Änderung ein Problem für Sie sein würde, ? Untersichten sollten basierend auf den Grenzen und nicht dem Rahmen der übergeordneten Ansicht positioniert werden. Das wird hier nicht anders sein. – rmaddy

+0

Guter Punkt, nur ich handle die Position einer 'UITabBar' (in einigen Bildschirmen angezeigt, in anderen versteckt), die keine Unteransicht von' self.view' ist. Außerdem kann "iOS 9" weder die Ansichtsgröße noch den Ursprung aktualisieren. – artooras

+0

Die von Ihnen angezeigte Ausgabe zeigt an, dass die Ansichtsgröße aktualisiert wurde. Es ist 504 in beiden Versionen von iOS. – rmaddy

Antwort

1

Ich fand die gleiche Änderung in iOS 9 im Vergleich zu früheren iOS-Versionen: in viewWillAppear, self.view.frame und self.view.bounds zeigen nur die Standardgröße in der Feder anstelle der tatsächlich zur Laufzeit verwendeten Größe. Das heißt, wenn Ihre Feder beispielsweise eine Standardbreite von 320 hat, aber auf einem iPhone 6, wird die Breite fälschlicherweise als 320 statt als 375 angezeigt.

Sie könnten [[UIScreen mainScreen] Grenzen verwenden] , wie in den Kommentaren zu der Frage vorgeschlagen, aber das würde nur funktionieren, wenn Ihre Ansichten immer den Bildschirm ausfüllen. Wenn Sie ein Split-Screen-Design auf einem iPad haben und die tatsächliche Anzeigebreite einer einzelnen Ansicht kennen müssen, ist sie in viewWillAppear nicht verfügbar.

Sie könnten viewWillLayoutSubviews anstelle von viewWillAppear verwenden, da der Rahmen und die Grenzen an diesem Punkt korrekt gesetzt sind. Dies wird jedoch nicht jedes Mal aufgerufen, wenn eine Ansicht angezeigt wird, sondern nur dann, wenn sie zum ersten Mal angezeigt wird. Dadurch ändert sich das Verhalten Ihrer App geringfügig.

Ich verwende eine Kombination von viewWillAppear und viewWillLayoutSubviews, zusammen mit einer neuen Instanz-Variable, die Pre-iOS 9 Verhalten in iOS zu replizieren 9:

@synthesize sizingReady; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // set a flag telling us whether the view size is available 
    // this is needed in iOS 9 because the view size isn't updated in viewWillAppear yet 
    self.sizingReady = FALSE; 
} 

- (void)viewWillAppear:(BOOL)animated { 
    // don't do anything until the view size is available, which doesn't happen until viewWillLayoutSubviews in iOS 9 
    if (!self.sizingReady) { 
     return; 
    } 

    [super viewWillAppear:animated]; 

    // your code goes here 
} 

- (void)viewWillLayoutSubviews { 
    [super viewWillLayoutSubviews]; 

    if (!self.sizingReady) { 
     self.sizingReady = TRUE; 
     [self viewWillAppear:TRUE]; 
    } 
} 
0

Sie Methode kann viewWillAppear Swizzling: und Verwendung Bildschirm Grenzen

 


- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    self.view.frame = [UIScreen mainScreen].bounds; 
} 

 

oder

 


- (void)viewDidLoad:(BOOL)animated { 
    [super viewDidLoad:animated]; 

    self.view.frame = [UIScreen mainScreen].bounds; 
}