2015-03-24 21 views
5

Sto cercando di ottenere l'area di disegno visibile per una sottoclasse di GLKViewController. In iOS 7, determinerei l'orientamento e quindi regolare [UIScreen mainScreen] .bounds.size di conseguenza. Quindi vorrei sottrarre le altezze della barra di navigazione e statusBarFrame e voilà! - la dimensione effettiva della mia area di disegno.viewWillTransitionToSize e navigazione errataBar e statusBarFrame heights

Ora sto cercando di aggiornare per iOS 8 con viewWillTransitionToSize, tuttavia quando ruoto il dispositivo (ho UIInterfaceOrientationMaskAll su), la dimensione che viene passata è errata. Infatti, la larghezza è corretta per la vista, ma non l'altezza (che coinvolge le altezze della barra di spostamento e della barra di stato).

Ho visto un paio di domande su SO che riguardano ma nulla che in realtà si occupa di questo problema, almeno nulla che mi ha aiutato.

Questo non mi sembra di fare qualcosa di interessante, mi corregga se sbaglio:

- (void)viewWillTransitionToSize : (CGSize) size 
     withTransitionCoordinator : (id<UIViewControllerTransitionCoordinator>) coordinator 
{ 
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; 

    NSLog(@"size changed : orig(%f,%f) mainScreen(%f,%f)", size.width, size.height, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height); 

    [self updateViews:size]; 
} 

uscite per la transizione al paesaggio:

size changed : orig(568.000000,256.000000) mainScreen(320.000000,568.000000) 

dove l'altezza è passato da viewWillTransitionToSize sembra essere:

320 - (2*32) = 256 

e quindi la rotazione successiva al ritratto:

size changed : orig(320.000000,536.000000) mainScreen(568.000000,320.000000) 

dove compare l'altezza passata da viewWillTransitionToSize per essere:

568 - 32 = 536 

sembra essere l'altezza della barra di navigazione in modalità orizzontale (se questo significa qualcosa).

Quindi le mie domande sono: come fa viewWillTransitionToSize ad avere questa dimensione? Come tiene conto delle barre supplementari che cambiano le dimensioni o scompaiono a seconda dell'orientamento? E, soprattutto, perché sta usando queste altezze errate?

+0

questo è lo stesso problema che ho a che fare con la società - io ottenere esattamente gli stessi numeri si stanno ottenendo quando i miei rotazione dello schermo, con la stessa discrepanza (32 o 64 punti). Il problema per me è che sto usando l'argomento 'dimensione' per ottenere la nuova altezza e larghezza della vista e quindi usare quei numeri per calcolare una dimensione di sottomenu. – Natalia

risposta

12

Se si osservano le dimensioni dei telai viewWillTransitionToSize:withTransitionCoordinationar:, è probabile che i telegrammi vengano visualizzati prima dell'aggiornamento.

Migliore utilizzo animateAlongsideTransition:completion: all'interno di questo metodo:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
{ 
    [super viewWillTransitionToSize:size 
      withTransitionCoordinator:coordinator]; 


    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) 
    { 
      //update views here, e.g. calculate your view 
    } 
           completion:^(id<UIViewControllerTransitionCoordinatorContext> context) 
    { 
    }]; 
} 
+0

Sì - grazie mille ha funzionato alla grande! Non riesco ancora a capire come funziona viewWillTransitionToSize. Perché dovrei ottenere i frame da prima dell'aggiornamento quando la dimensione indicata nei parametri è la dimensione a cui è stata eseguita la transizione? Mi manca qualcosa di ovvio? La dimensione dopo la transizione non è sicuramente una vecchia cornice, ma non è nemmeno la cornice giusta. – dragonflyesque

+0

Ho riscontrato esattamente lo stesso problema che descrivi. La cosa strana è che quando i dispositivi ruotano da destra a sinistra di paesaggio, viene fornita la cornice corretta. Il problema si verifica solo quando si passa da orizzontale a verticale e viceversa. – Tuslareb

+4

Questo perché quando la rotazione tra verticale e orizzontale (o viceversa) la nuova altezza delle barre non è ancora incorporata nel parametro size di viewWillTransitionToSize.Ma a sinistra, a sinistra e a sinistra del paesaggio, si utilizza la stessa barra di navigazione e l'altezza della barra degli strumenti, quindi in tal caso non è necessario attendere fino a quando queste barre non sono state ridimensionate. L'obiettivo C è pieno di attività così complesse, in cui è necessario utilizzare i blocchi di completamento o le funzioni di invio per ottenere i tempi giusti. Lontano da banale e facile da trascurare. – marcelnijman

Problemi correlati