У меня была такая же проблема:
- запустить приложение в портретном режиме (например)
- запустить видеоплеер (наш показывается с помощью
presentModalViewController
).
- повернуть iPad
- выйти из видео нажатием кнопки «Готово».
Bam! Макет нашего приложения нарушен (мы делаем некоторые нестандартные макеты для каждой ориентации), и строка состояния находится в неправильном месте, несмотря на то, что в видео находится в правильном месте.
Я сделал две вещи, чтобы исправить две проблемы:
- убедитесь, что наша пользовательская конфигурация, которая выполняется в
viewWillAppear
, выполняется ПОСЛЕ вызова [super viewWillAppear];
.
- реализовать наблюдателей для
MPMoviePlayerDidExitFullscreenNotification
и MPMoviePlayerPlaybackDidFinishNotification
(первый никогда не вызывался при нажатии кнопки «Готово» в моем случае).
Код для обратного вызова наблюдателя выглядит так:
[self performSelector: @selector(checkAndFixStatusBar)
withObject: nil
afterDelay: 0];
[[NSNotificationCenter defaultCenter] removeObserver: self];
И последний метод, вызываемый после преднамеренной задержки 0:
- (void)checkAndFixStatusBar
{
UIInterfaceOrientation intOrient = self.interfaceOrientation;
UIInterfaceOrientation sbOrient = [[UIApplication sharedApplication] statusBarOrientation];
if (intOrient != sbOrient)
{
[[UIApplication sharedApplication] setStatusBarOrientation: intOrient animated: NO];
NSLog(@"Fixed status bar orientation");
}
}
Все еще ощущается мигание строки состояния, но это лучшее, что я придумал.
Надеюсь, это поможет.
РЕДАКТИРОВАТЬ: я удалил шаг performSelector
и напрямую вызвал настройку строки состояния, в моем случае это не делает заметной разницы (все еще мигает).