Этот вопрос задавался очень давно, но я хотел бы помочь другим, поделившись своим опытом, потому что мне потребовалось некоторое время, чтобы понять его.
У меня есть контроллер, который помещается вконтроллер навигации, который сам по себе является первой вкладкой в UITabBarController
.От моего контроллера я представляю модальный контроллер представления, который воспроизводит полноэкранное видео, используя MPMoviePlayerController
.Когда видео заканчивается, я программно закрываю контроллер модального вида и возвращаюсь к предыдущему экрану.Но иногда после увольнения строка состояния исчезала, а размер панели навигации изменялся, чтобы занять место в строке состояния.В других случаях панель навигации была наполовину обрезана и выглядела так, как будто она перекрывает строку состояния.
Такое поведение было замечено в большинстве случаев, но не всегда, что делало его очень запутанным.Я перепробовал много вещей, которые предлагают другие люди из StackOverflow, среди которых явное скрытие строки состояния в viewWillAppear:
, возвращение YES
по крайней мере для одной ориентации в shouldAutorotateToInterfaceOrientation:
, представление контроллера модального представления из контроллера навигацииили даже контроллер tabBar (который является корневым контроллером представления моего окна), отказывающийся от метода протокола вместо вызова dismissViewControllerAnimated:completion:
непосредственно из модального контроллера представления, играющего с MPMoviePlayerController
уведомлениями и состояниями.Казалось, ничего не помогло.
В конце я понял, что мои проблемы возникают только тогда, когда видео заканчивается, а элементы управления видео (включая строку состояния) были скрыты.Я полагаю, что поскольку мой модальный контроллер представления является полноэкранным (его свойство wantsFullScreenLayout
установлено в YES
) и представляется из контроллера представления внутри контроллера навигации и контроллера tabBar, когда строка состояния скрыта в моментУвольнение, это заставляет контроллер навигации изменять размеры своего дочернего контроллера представления и заполнять экран, скрывая строку состояния или перекрывая ее.На самом деле я смог увидеть это, зарегистрировав размер моего DetailsViewController (тот, который помещается в контроллер навигации).
Итак, я сделал самую интуитивную вещь - я явно показал строку состояния прямо перед отключением контроллера модального представления.Это решило это полностью, и теперь мой код выглядит так:
1.Представление контроллера модального вида из DetailsViewController
[self presentViewController:controller animated:YES completion:NULL];
2.Отстранение модального контроллера вида от самого себя
[[UIApplication sharedApplication] setStatusBarHidden:NO];
[self dismissViewControllerAnimated:YES completion:nil];