Интерактивный просмотр контроллера увольнения и изменения статуса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 исправила его в последнее время.