2015-03-30 20 views
9

Ich habe eine UIViewController, die eine weitere UIViewController darstellt. Beide View-Controller verwenden topLayoutGuide und bottomLayoutGuide mit Auto-Layout.Benutzerdefinierter UIViewController-Übergang hat einen falschen topLayoutGuide und bottomLayoutGuide gesetzt, wenn die Anrufleiste aktiv ist.

Alles ist in Ordnung, mit und ohne In-Call-Bar. Oder mit oder ohne individuellen Übergang ...

Aber, wenn es eine in-Call ist bar und einen benutzerdefinierten Übergang, die subview meiner präsentiert View-Controller ist fehl am Platz von 20px nach unten (was zu einer abgeschnittenen Ansicht unten).

ich geprüft und es ist die topLayoutGuide und bottomLayoutGuide, die fehl am Platze sind ...

Hier ist der Code des Übergangs:

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

Hier ist der Code des präsentierenden:

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

haben Sie versucht nav.modalPresentationStyle = UIModalPresentationCustom; anstelle von UIModalPresentationFullScreen für Ihren benutzerdefinierten Übergang – Mukesh

+1

habe ich versucht - funktioniert nicht. – NAlexN

Antwort

0

Beim Erstellen der Ansichten für Ihre Ansichtshierarchie sollten Sie immer die Autorisierungseigenschaften Ihrer Ansichten festlegen. Wenn ein Ansichts-Controller auf dem Bildschirm angezeigt wird, wird seine Grundansicht in der Regel an den verfügbaren Platz angepasst, der je nach der aktuellen Ausrichtung des Fensters und dem Vorhandensein anderer Schnittstellenelemente wie der Statusleiste variieren kann. Sie können die Autorisierungseigenschaften in Interface Builder im Inspektorfenster oder programmgesteuert konfigurieren, indem Sie die Eigenschaften autoresizesSubviews und autoresizingMask jeder Ansicht ändern. Das Festlegen dieser Eigenschaften ist auch wichtig, wenn der View-Controller Hoch- und Querformat unterstützt. Während einer Orientierungsänderung verwendet das System diese Eigenschaften, um die Ansichten automatisch neu zu positionieren und ihre Größe zu ändern, um sie an die neue Ausrichtung anzupassen. Wenn Ihr View-Controller das automatische Layout unterstützt und ein untergeordnetes Element eines anderen View-Controllers ist, sollten Sie die setTranslatesAutoresizingMaskIntoConstraints: -Methode der Ansicht aufrufen, um diese Einschränkungen zu deaktivieren.