Интерактивный просмотр контроллера увольнения и изменения статусаBarStyle несовместим?

6 Ortwin Gentz [2014-01-24 18:30:00]

Я представляю модальный UINavigationController с интерактивным увольнением. Контроллер родительского представления имеет темную строку состояния, а контроллер модального представления - индикатор состояния. Я использую конфигурацию отображения строки состояния на основе контроллера iOS 7.

Все работает нормально, пока я представляю и отклоняю контроллер представления не интерактивно. Однако, когда я начинаю интерактивный переход с отменой и отменяет его, цвет строки состояния остается темным.

Я создал образец проекта. Нажмите кнопку "Меню", затем запустите интерактивный переход путем панорамирования с правого края экрана.

Вещи, которые я пробовал:

  • вызов -setNeedsStatusBarAppearanceUpdate на любом из контроллеров навигации и просмотра, которые были задействованы после того, как переход был отменен.
  • Изменение параметра navigationBar.barStyle на UIBarStyleDefault и обратно на UIBarStyleBlack

Я также подтвердил, что statusBarStyle моего модального контроллера навигации настроен правильно:

(lldb) p (UIStatusBarStyle) [[[[[UIApplication sharedApplication] keyWindow] rootViewController] presentedViewController] preferredStatusBarStyle]
(UIStatusBarStyle) $8 = UIStatusBarStyleLightContent

Тем не менее, строка состояния черная.

Любая дальнейшая идея, что я мог попробовать?

ios cocoa-touch uikit uiviewcontroller statusbar


2 ответа


6 Решение Ortwin Gentz [2014-01-24 20:09:00]

Для меня это выглядит как ошибка (rdar://15902745) в UINavigationController. После отмененного увольнения UINavigationController не запрашивает снова его presentedViewController для preferredStatusBarStyle, но использует preferredStatusBarStyle от себя. Я работал над этим, перезаписав -childViewControllerForStatusBarStyle:

- (UIViewController*)childViewControllerForStatusBarStyle {
    if (self.presentedViewController) {
        return self.presentedViewController.childViewControllerForStatusBarStyle;
    }

    return [super childViewControllerForStatusBarStyle];
}

Затем, чтобы оживить изменение во время (а не после) увольнения, я также перезаписал -preferredStatusBarStyle.

Я применил обходной путь к образцу проекта.


0 Vilém Kurz [2015-08-05 00:14:00]

Не забудьте вызвать

[self.transitionContext cancelInteractiveTransition];

в реализации подкласса UIPercentDrivenInteractiveTransition - (void)cancelInteractiveTransition. Для вдохновения это моя реализация

- (void)cancelInteractiveTransition {

id<UIViewControllerContextTransitioning> transitionContext = self.transitionContext;
[transitionContext cancelInteractiveTransition];

UIView *fromView = [UIViewController fromViewForTransitioningContext:transitionContext];
UIView *toView = [UIViewController toViewForTransitioningContext:transitionContext];

if (self.presenting)
{
    CGRect endFrame = CGRectOffset([[transitionContext containerView] bounds], 0, CGRectGetHeight([[transitionContext containerView] bounds]));

    [UIView animateWithDuration:ANIMATION_DURATION_PAN animations:^{

        toView.frame = endFrame;

    } completion:^(BOOL finished) {

        [transitionContext completeTransition:NO];
    }];
}
else {

    CGRect endFrame = [[transitionContext containerView] bounds];

    [UIView animateWithDuration:ANIMATION_DURATION_PAN animations:^{
        fromView.frame = endFrame;
    } completion:^(BOOL finished) {
        [transitionContext completeTransition:NO];
    }];
}

}

edit: похоже, это помогает в iOS 8.4. Протестировано по 7.1, но никак. Возможно, Apple исправила его в последнее время.