2015-09-24 9 views
8

Mam niestandardowe przejście między kontrolerami widoku osadzonymi w UINavigationController, który działa poprawnie, gdy jest zbudowany z systemem iOS 7/8, ale ma nieprawidłowy układ, gdy jest zbudowany na SDK iOS 9.Niestandardowe przejście do animacji wypychania za pomocą NavigationController na iOS 9

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext 
{ 
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; 
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; 

    [transitionContext.containerView addSubview:toViewController.view]; 

    ... 

Następnie włącza się i wykonuje animację. Problem polega na tym, że zawartość pliku toViewController, nawet jeśli korzysta z odpowiedniego ograniczenia automatycznego układu strony przewodnika układu, przedstawia zawartość za paskiem nawigacji.

Mimo to działa dobrze na iOS 8 i jeśli wymuszamy przerysowanie (np. Wysłanie aplikacji na tło i przywrócenie jej, pokazanie modalu na wierzchu i odrzucenie go, itp.) Spowoduje cały system automatycznego układania aby przerysować widok, a widok toViewController przeskoczył w odpowiednie miejsce (jako górny przewodnik układu, x piksele z paska nawigacyjnego zamiast x pikseli od górnej części ekranu urządzenia).

Dodawanie

[self.view setNeedsUpdateConstraints]; 
[self.view layoutIfNeeded]; 

działa, jeśli umieścić w viewDidAppear:animated, ale nie działa na viewDidLoad lub viewWillAppear:animated. Nie jest to rozwiązanie jak użytkownicy zobaczyć skoki widok kiedy odrysowywanie dzieje się viewDidAppear:animated

Odpowiedz

22

udało mi się rozwiązać mój problem, dodając następującą linię przed addSubview::

toViewController.view.frame = [transitionContext finalFrameForViewController:toViewController]; 

z dokumentacji firmy Apple dla finalFrameForViewController:

Zwraca prostokąt ramki zakończenie dla określonego widoku kontrolera widzenia.

Prostokąt zwracany przez tę metodę reprezentuje rozmiar odpowiedniego widoku na końcu przejścia. Dla widoku przykrytego podczas prezentacji wartość zwrócona przez tę metodę może być CGRectZero, ale może to być również poprawny prostokąt klatki o rozmiarze .

+0

Ratownik, dzięki kolego – beebcon

+0

Właśnie uratowałeś mi wiele godzin. Wielkie dzięki! –

Powiązane problemy