2015-03-30 27 views
9

Mam UIViewController prezentujący inny UIViewController. Oba kontrolery widoku używają topLayoutGuide i bottomLayoutGuide z Auto-układem.Niestandardowe przejście UIViewController ustaw nieprawidłowe topLayoutGuide i bottomLayoutGuide, gdy aktywny jest pasek połączenia

Wszystko w porządku, z paskiem i bez niego. Lub z lub bez niestandardowego przejścia ...

Ale, gdy znajduje się w wezwanie bar i niestandardową przejściowym subview mojego prezentowanym kontrolera widok jest niesłuszna od 20px w dół (w wyniku ściętym widzenia na dnie).

sprawdziłem i jest to topLayoutGuide i bottomLayoutGuide które są niewłaściwie ...

Oto kod przejścia:

#pragma mark - GETTER 
- (CGFloat)presentationTopProgressValue { 
    return __fromViewControllerView.y/__containerView.height; 
} 

#pragma mark - SETTER 
- (void)set_context:(id<UIViewControllerContextTransitioning>)_context { 
    __context = _context; 
    __containerView = [__context containerView]; 

    __fromViewController = [__context viewControllerForKey:UITransitionContextFromViewControllerKey]; 
    __fromViewControllerView = [__fromViewController view]; 
    __toViewController = [__context viewControllerForKey:UITransitionContextToViewControllerKey]; 
    __toViewControllerView = [__toViewController view]; 
} 

#pragma mark - TRANSITION 
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source { 
    return self; 
} 

#pragma mark - ANIMATING 
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext { 
    self._context = transitionContext; 

    UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:__containerView]; 

    UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[__fromViewControllerView]]; 
    gravityBehavior.gravityDirection = CGVectorMake(0, 5.0f); 

    __weak typeof(self) weakSelf = self; 
    gravityBehavior.action = ^{ 
     typeof(self) strongSelf = weakSelf; 

     if ([strongSelf presentationTopProgressValue] > 1.0) { 
      [animator removeAllBehaviors]; 

      [strongSelf._context completeTransition:YES]; 
      strongSelf._context = nil; 
     } 
    }; 

    [__containerView addSubview:__toViewControllerView]; 
    [__containerView addSubview:__fromViewControllerView]; 

    [animator addBehavior:gravityBehavior]; 
} 

- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext { 
    return 0.2f; 
} 

Oto kod z prezentowania:

MPProfileViewController *next = [MPProfileViewController new]; 
MPNavigationController *nav = [[MPNavigationController alloc] initWithRootViewController:next]; 
#warning - The transition delegate create a wrong margin layout when in-call bar is active 
nav.modalPresentationStyle = UIModalPresentationFullScreen; 
nav.transitioningDelegate = __dragToDismiss; 
[self.navigationController presentViewController:nav animated:YES completion:nil]; 
+0

wypróbowałeś nav.modalPresentationStyle = UIModalPresentationCustom; zamiast UIModalPresentationFullScreen dla niestandardowego przejścia – Mukesh

+1

Próbowałem - nie działa. – NAlexN

Odpowiedz

0

Podczas tworzenia widoków dla hierarchii widoków zawsze powinieneś ustawić właściwości autorezjowania swoich widoków. Gdy kontroler widoku jest wyświetlany na ekranie, jego widok główny jest zwykle zmieniany w celu dopasowania do dostępnego miejsca, które może się różnić w zależności od bieżącej orientacji okna i obecności innych elementów interfejsu, takich jak pasek stanu. Możesz skonfigurować właściwości autorezjowania w Konstruktorze interfejsów, korzystając z okna inspektora lub programowo, modyfikując właściwości autoreizesSubviews i autoreasizingMask każdego widoku. Ustawienie tych właściwości jest również ważne, jeśli kontroler widoku obsługuje orientacje pionową i poziomą. Podczas zmiany orientacji system używa tych właściwości do automatycznego zmieniania położenia i zmiany rozmiarów widoków w celu dopasowania do nowej orientacji. Jeśli kontroler widoku obsługuje układ automatyczny i jest dzieckiem innego kontrolera widoku, należy wywołać metodę setTranslatesAutoresizingMaskIntoConstraints widoku, aby wyłączyć te więzy.