Пользовательский переход UIViewController устанавливает неправильные topLayoutGuide и bottomLayoutGuide, когда активна панель вызова

У меня есть UIViewController представляя другой UIViewController, Оба вида контроллеров используют topLayoutGuide а также bottomLayoutGuide с автоматической компоновкой.

Все в порядке, с и без панели вызова. Или с пользовательским переходом или без него...

Но, когда есть панель вызовов и пользовательский переход, подпредставление моего представленного контроллера представления смещено на 20 пикселей вниз (что приводит к обрезанному представлению внизу).

Я проверил, и это topLayoutGuide а также bottomLayoutGuide которые неуместны...

Вот код перехода:

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

Вот код представления:

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];

1 ответ

При создании представлений для вашей иерархии представлений вы всегда должны устанавливать свойства автоматического изменения размеров ваших представлений. Когда контроллер представления отображается на экране, его корневое представление обычно изменяется в соответствии с доступным пространством, которое может варьироваться в зависимости от текущей ориентации окна и наличия других элементов интерфейса, таких как строка состояния. Вы можете настроить свойства автоматического изменения размера в Интерфейсном Разработчике, используя окно инспектора или программно, изменив свойства autoresizesSubviews и autoresizingMask для каждого представления. Установка этих свойств также важна, если ваш контроллер представления поддерживает как книжную, так и альбомную ориентации. Во время изменения ориентации система использует эти свойства для автоматического изменения положения и изменения размеров видов в соответствии с новой ориентацией. Если ваш контроллер представления поддерживает автоматическое расположение и является дочерним по отношению к другому контроллеру представления, вам следует вызвать метод setTranslatesAutoresizingMaskIntoConstraints: метод, чтобы отключить эти ограничения.

Другие вопросы по тегам