Переход панели навигации при представлении контроллера представления через подкласс UIPresentationController

Я создаю приложение для iOS 8 и использую UIPresentationController для представления контроллера представления индивидуальным образом. (см. мой предыдущий вопрос по этому поводу здесь: Репликация стиля функции создания приложения для iOS Mail).

Проблема, с которой я сталкиваюсь, заключается в том, что когда я представляю контроллер, панель навигации начинается с 64 точек в высоту, а затем перепрыгивает / сжимается до 44 после завершения ее представления. Я предполагаю, что контроллер представления понимает, что он не закрывает строку состояния, и поэтому он сжимается, когда доходит до своего окончательного положения покоя. Я бы хотел, чтобы панель навигации была высотой 44 точки все время и не прыгала / не сжималась.

На изображении ниже показано, как выглядит контроллер представления в конце презентации. Это также то, что я хочу, чтобы он выглядел все время. Есть мысли о том, как держать панель навигации на 44 точках все время?

введите описание изображения здесь

ОБНОВЛЕНИЕ (24.03.2015):

Некоторое время назад я ссылался на сообщение в блоге, чтобы найти дополнительную информацию по этой проблеме. По сути, UINavigationController рисует свою панель навигации высотой 64 или 44 точки в зависимости от того, совпадает ли рамка его представления с окном приложения или нет. Поэтому мне нужен способ сообщить навигационному контроллеру, что его конечное исходное положение не будет совпадать с окном и что панель навигации должна быть нарисована на 44 точки в высоту.

http://blog.jaredsinclair.com/post/61507315630/wrestling-with-status-bars-and-navigation-bars-on


person Brian Sachetta    schedule 18.03.2015    source источник


Ответы (2)



У меня была проблема, немного похожая на вашу, когда панель навигации изменяла размер после вызова [transitionContext completeTransition:YES], основываясь на визуальной непрерывности фрейма navigationBar, разделяющего границу с верхней частью UIWindow. Моя панель навигации была далеко не наверху, поэтому она изменила свой размер до 44 пикселей вместо обычных 64 пикселей. Чтобы обойти это, я просто завершил переход перед анимацией альфы и позиции toViewController. То есть, как только все было правильно расположено для анимации, я вызвал completeTransition:, чтобы позволить navigationController настроить себя, пока он невидим. Пока что у этого не было никаких непредвиденных побочных эффектов, и дополнительная альфа-вставка, анимация перемещения кадра все еще продолжается после того, как вы completeTransition.

Вот мой метод animateTransition: в моем классе аниматора презентации, который соответствует <UIViewControllerAnimatedTransitioning>

    UIViewController *toViewController          = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIViewController *fromViewController        = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];

    UIViewController *presentedViewController   = self.presenting ? toViewController : fromViewController;
    UIView *containerView                       = [transitionContext containerView];

    NSTimeInterval animationDuration            = [self transitionDuration:transitionContext];

    if (self.presenting) {
        containerView.alpha = 0.0;
        presentedViewController.view.alpha = 0.0;
        [containerView addSubview:presentedViewController.view];
        [UIView animateWithDuration:animationDuration delay:0 options:kNilOptions animations:^{
            containerView.alpha = 1.0;
        } completion:^(BOOL finished) {
            presentedViewController.view.frameTop += 20;
            //I complete the transition here, while my controller's view is still invisible, 
            // but everything is in its proper place.  This effectively positions everything 
            // for animation, while also letting the navigation bar resize itself without jarring visuals.
            [transitionContext completeTransition:YES];
            //But we're not done quite yet...
            [UIView animateWithDuration:animationDuration delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
                presentedViewController.view.frameTop -= 20;
                presentedViewController.view.alpha = 1.0;
            } completion:nil];
        }];
    }

    if (!self.presenting) {
        [UIView animateWithDuration:animationDuration delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
            presentedViewController.view.alpha = 0.0;
            presentedViewController.view.frameTop += 20;
        } completion:^(BOOL finished) {
            [UIView animateWithDuration:animationDuration delay:0 options:kNilOptions animations:^{
                containerView.alpha = 0.0;
            } completion:^(BOOL done) {
                [transitionContext completeTransition:YES];
            }];
        }];
    }

Надеюсь, это поможет любому, кто окажется в моем положении!

person Carter Hudson    schedule 04.08.2015