2015-10-07 11 views
9

Wydaje się, że metoda viewWillTransitionToSize:withTransitionCoordinator: jest wywoływana wiele razy, gdy aplikacja przechodzi do tła lub nieaktywna od iOS 9.viewWillTransitionToSize: withTransitionCoordinator: wywoływana, gdy aplikacja przechodzi w tle lub nieaktywne

Na przykład, jeśli aplikacja jest w widoku na iPadzie naciśnięcie przycisku strony głównej spowoduje, że aplikacja otrzyma najpierw wywołanie metody o rozmiarze 1024 x 768 (krajobraz), a następnie o rozdzielczości 768 x 1024 (z powrotem do portretu). To prowadzi mnie do wniosku, że iOS robi to, aby uzyskać zrzuty ekranu dla przełącznika aplikacji.

Nasza logika aplikacji zależy od wielkości ekranu i zmian zadań wyzwalacza wielkości ekranu, które aktualizują nasz model w odniesieniu do nowego rozmiaru. Musimy to zrobić, gdy użytkownik obróci urządzenie lub przejdzie w tryb wielozadaniowości (widok podzielony), ale nie możemy tego robić, gdy użytkownik znajdzie się w tle.

Jednym z pomysłów było wykorzystanie UIApplicationWillResignActiveNotification zgłoszenie, ale to okazało się mission impossible, bo czasami viewWillTransitionToSize:withTransitionCoordinator: zostanie wezwany przed powiadomienie jest wysyłane i othertimes to jest wywoływana po wysyłane jest powiadomienie:/

pomysłów ?

Odpowiedz

1

Obecnie mam ten sam problem. Wykonuję dużo pracy, gdy zmienia się rozmiar i nie może się zdarzyć, gdy przechodzę w tło. Jedną z rzeczy, która działa dla mnie "większość" czasu, jest sprawdzenie, czy aplikacja działa w tle za pomocą [uiapplication sharedApplication] applicationState]. Stan aplikacji jest ustawiony na UIApplicationStateBackground przed wykonaniem 2 dodatkowych wywołań do viewWillTransitionToSize. Wydaje się to być spójne. Mam problemy, gdy aplikacja jest przeciągana za pomocą wielozadaniowości, a następnie przechodzi w tło, a następnie ponownie na pierwszy plan w pełnym rozmiarze. Kolejność wywołań nie wydaje się być w tym przypadku spójna, aby określić, które zmiany rozmiaru powinny zostać użyte.

+0

Moje bieżące obejście jest odroczenie logikę w viewWillTransitionToSize przez 0,1 sekundy i sprawdzić czy UIApplication.sharedApplication(). ApplicationState jest nadal aktywny. To brzydki hack, ale nie widzę innego wyjścia. –

0

Tak, ten sam problem. Zamiast 0,1 sekundy można użyć koordynatora: transitionDuration(). Następnie sprawdź status tła.

+0

Niestety nie, jeśli interesujesz się stanem przed zakończeniem animacji ... –

1

W viewWillTransitionToSize:withTransitionCoordinator można użyć UIViewControllerTransitionCoordinator, aby powiedzieć, kiedy przejście zostało zakończone. Następnie sprawdź, czy Twoja aplikacja nie jest w tle i wykonuj swoją logikę.

- (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

Jeśli naciśniesz przycisk zasilania, wiele razy zwróci on activeState. – Rajneesh071

Powiązane problemy