2015-03-30 23 views
9

Ho un UIViewController che presenta un altro UIViewController. Entrambi i controller di visualizzazione utilizzano topLayoutGuide e bottomLayoutGuide con Auto-Layout.La transizione personalizzata di UIViewController imposta una topLayoutGuide e una guida di discesa bassa quando è attiva la barra di chiamata

Tutto va bene, con e senza barra di chiamata. O con o senza passaggio personalizzato ...

Ma, quando c'è una chiamata in-bar e una transizione personalizzato, la visualizzazione secondaria del mio controller della vista presentato è fuori luogo di 20px verso il basso (con conseguente una vista tagliata in basso).

ho controllato ed è il topLayoutGuide e bottomLayoutGuide che sono fuori luogo ...

Ecco il codice della transizione:

#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; 
} 

Ecco il codice della presentazione:

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

hai provato nav.modalPresentationStyle = UIModalPresentationCustom; invece di UIModalPresentationFullScreen per la transizione personalizzata – Mukesh

+1

ho provato - non funziona. – NAlexN

risposta

0

Quando crei le viste per la tua gerarchia di viste, devi sempre impostare le proprietà di autoresizing delle tue viste. Quando un controller di visualizzazione viene visualizzato sullo schermo, la sua vista di root viene in genere ridimensionata per adattarsi allo spazio disponibile, che può variare in base all'orientamento corrente della finestra e alla presenza di altri elementi dell'interfaccia come la barra di stato. È possibile configurare le proprietà di autoresizing in Interface Builder utilizzando la finestra di ispezione o in modo programmatico modificando le proprietà autoresizesSubviews e autoresizingMask di ogni vista. L'impostazione di queste proprietà è importante anche se il controller della vista supporta sia l'orientamento verticale che orizzontale. Durante un cambio di orientamento, il sistema utilizza queste proprietà per riposizionare e ridimensionare automaticamente le viste in modo che corrispondano al nuovo orientamento. Se il tuo controller di visualizzazione supporta il layout automatico ed è figlio di un altro controller di visualizzazione, dovresti chiamare setTranslatesAutoresizingMaskIntoConstraints della vista: metodo per disabilitare questi vincoli.