2015-10-07 12 views
9

Sembra che il metodo viewWillTransitionToSize:withTransitionCoordinator: viene chiamato più volte quando l'applicazione passa in secondo piano o inattiva dal iOS 9.viewWillTransitionToSize: withTransitionCoordinator: chiamato quando un'applicazione passa in secondo piano o inattivo

Per esempio, se l'applicazione è nel ritratto su iPad, premendo il pulsante home, l'app riceverà prima la chiamata al metodo con dimensioni di 1024x768 (orizzontale) e quindi con 768x1024 (di nuovo in verticale). Questo mi porta a concludere che iOS fa questo per ottenere screenshot per lo switcher delle app.

La nostra logica di applicazione dipende dalle dimensioni dello schermo e dalle modifiche alle attività di attivazione delle dimensioni dello schermo che aggiornano il nostro modello in relazione alle nuove dimensioni. Dobbiamo farlo quando l'utente ruota il dispositivo o passa alla modalità multitasking (split view), ma non dobbiamo farlo quando l'utente va in background.

Un'idea era quella di utilizzare UIApplicationWillResignActiveNotification notifica, ma che si è rivelata una missione impossibile perché a volte viewWillTransitionToSize:withTransitionCoordinator: viene chiamato prima che la notifica viene inviata e othertimes che viene chiamato dopo che la notifica viene inviata:/

Tutte le idee ?

risposta

1

Attualmente ho lo stesso problema. Faccio un sacco di lavoro quando le dimensioni cambiano e non posso farlo accadere quando si passa in secondo piano. Una cosa che funziona per me "la maggior parte" del tempo è controllare se l'app è in background usando [uiapplication sharedApplication] applicationState]. Lo stato dell'applicazione è impostato su UIApplicationStateBackground prima che vengano eseguite le 2 chiamate extra a viewWillTransitionToSize. Questo sembra essere coerente. Sto riscontrando alcuni problemi quando l'app viene scaricata utilizzando il multitasking, quindi passa in background e quindi nuovamente in primo piano a dimensioni intere. In questo caso, l'ordine delle chiamate non sembra coerente per determinare quali modifiche alle dimensioni devono essere utilizzate.

+0

mia soluzione attuale è quella di rinviare la logica in viewWillTransitionToSize di 0,1 secondi e controllare se UIApplication.sharedApplication(). ApplicationState è ancora attivo. È il brutto scherzo, ma non vedo nessun altro modo di aggirarlo. –

0

Sì, lo stesso problema. È possibile, invece di utilizzare 0,1 secondi, utilizzare il coordinatore transitionDuration(). Quindi, controlla lo stato dello sfondo.

+0

Sfortunatamente non se sei interessato allo stato prima che l'animazione sia completata ... –

1

In viewWillTransitionToSize:withTransitionCoordinator è possibile utilizzare UIViewControllerTransitionCoordinator per indicare quando la transizione è completa. Quindi, controlla che la tua app non sia in background ed esegua la tua logica.

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { 
    [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) { 

     // after transition 

     if ([UIApplication sharedApplication].applicationState != UIApplicationStateBackground) { 
      // perform logic 
     } 
    }]; 
} 
+1

Se premi il pulsante di accensione, molte volte tornerà a essere attivo. – Rajneesh071

Problemi correlati