2015-09-24 14 views
5

Ho notato un cambiamento nel modo in cui iOS 9 carica/visualizza viste rispetto alle versioni precedenti di iOS. Ecco una potenza di self.view.frame in iOS 8.4iOS 9 cambiato visualizzazione comportamento di caricamento

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

Ed ecco lo stesso per iOS 9

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

Si noti che in viewWillAppear metodo iOS 9 non riesce ad aggiornare il origin di self.view.frame.

Ciò causa alcuni problemi nella mia app come le viste che inizialmente si trovano in una posizione errata.

Qualcuno sa se è destinato o è un difetto? E forse una soluzione rapida?

+0

Perché questo cambiamento è un problema per voi ? Le sottoview dovrebbero essere posizionate in base ai limiti, non al frame, della loro vista genitore. Non sarà diverso qui. – rmaddy

+0

Buon punto, sto solo gestendo la posizione di un 'UITabBar' (che appare in alcuni schermi, nascosto in altri), che non è una sottoview di' self.view'. Inoltre, 'iOS 9' non riesce ad aggiornare la dimensione della vista e l'origine. – artooras

+0

L'output visualizzato indica che la dimensione della vista è stata aggiornata. È 504 in entrambe le versioni di iOS. – rmaddy

risposta

1

Ho trovato lo stesso cambiamento in iOS 9 rispetto alle versioni precedenti di iOS: in viewWillAppear, self.view.frame e self.view.bounds mostrano solo la dimensione predefinita utilizzata nel pennino invece della dimensione effettivamente utilizzata in fase di esecuzione. Ciò significa che, ad esempio, se il tuo pennino ha una larghezza predefinita di 320 ma lo esegui su un iPhone 6, la larghezza verrà erroneamente indicata come 320 anziché 375.

È possibile utilizzare i limiti [[UIScreen mainScreen]] , come suggerito nei commenti alla domanda, ma funzionerebbe solo se le tue visualizzazioni riempiono sempre lo schermo. Se hai un design a schermo diviso su un iPad e hai bisogno di conoscere l'effettiva larghezza di visualizzazione di una singola vista, non è disponibile in viewWillAppear.

È possibile utilizzare viewWillLayoutSubview anziché viewWillAppear, poiché il frame ei limiti sono impostati correttamente in quel punto. Tuttavia, questo non viene chiamato ogni volta che viene visualizzata una vista, solo quando viene visualizzata per la prima volta, quindi il comportamento dell'app cambierà leggermente.

sto usando una combinazione di viewWillAppear e viewWillLayoutSubviews, insieme a una nuova variabile di istanza, per replicare il comportamento pre-iOS 9 in iOS 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

metodo è possibile swizzling viewWillAppear:, e l'uso schermo limiti

 


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

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

 

o

 


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

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