Ошибка IPad при использовании MPMoviePlayerViewController

Краткое описание проблемы

Изменение ориентации устройства iPad или симулятора при воспроизведении видео с использованием MPMoviePlayerViewController приводит к несогласованному состоянию вращения при увольнении видеопроигрывателя. Это известная ошибка в iPad SDK 3.2, зарегистрированная на http://www.openradar.me/8012810

Пример проекта

Я подготовил проект минимальной выборки, используя шаблон приложения на основе View из Xcode 3.2.2, используя следующий код для запуска проигрывателя

NSURL *movieUrl = [NSURL URLWithString:@"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"];
MPMoviePlayerViewController *player = [[MPMoviePlayerViewController alloc] initWithContentURL:movieUrl];
[self presentMoviePlayerViewControllerAnimated:player];
[player release];

Код доступен в GitHub по адресу http://github.com/adamalex/FullScreenMovie или прямой загрузке с помощью http://github.com/adamalex/FullScreenMovie/zipball/master

Шаги по воспроизведению

  • Получить проект, используя приведенную выше информацию
  • Запустите проект с помощью имитатора или устройства iPad.
  • Нажмите кнопку, чтобы начать воспроизведение видео.
  • Поверните iPad на 90 градусов.
  • Отклонить видео
  • Обратите внимание, что UIStatusBar не синхронизирован с пользовательским интерфейсом приложения

Цель

Я связался с Apple, и они подтвердили, что это ошибка, которая исследуется. Я хотел бы обсудить временные обходные пути, которые используют общедоступные API для безопасного хранения в App Store. Я собираюсь также открыть приложение для поддержки разработчиков с Apple, и я вернусь с моим собственным прогрессом.

Ответ 1

Успешный ответ от технической поддержки Apple Developer!

Это известная ошибка, и мы получили несколько дубликатов отчетов об ошибках, поэтому iOS-технология знает об этой проблеме, и у нас есть временное решение, как это было предложено инженерами iOS.

Вам нужно будет реализовать это в контроллере представления, который представляет проигрывателя.

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
   [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
   [self performSelector:@selector(fixStatusBar) withObject:nil afterDelay:0];
}

- (void)fixStatusBar {
   [[UIApplication sharedApplication] setStatusBarOrientation:[self interfaceOrientation] animated:NO];
}

Хотя это несколько уродливо, на данный момент это должно решить проблему. Было бы желательно удалить этот код после исправления ошибки в системе.

Это полностью позаботилось о проблеме, и вы можете вернуться к http://github.com/adamalex/FullScreenMovie для кода с примененным исправлением.

Ответ 2

Это также решает проблему вращения iPhone/iPodTouch, с которой я боролся. Я разрабатываю универсальное приложение, в котором каждый вид отображает другое изображение в зависимости от того, находится ли устройство в портретной или альбомной ориентации. Кнопки используются для навигации между представлениями.

Если приложение запущено на устройстве, а портретный вид повернут в альбомное, произойдет мое переключение изображений. Если устройство затем помещено на верхнюю часть стола, и кнопка нажата для отображения следующего вида, представление отображается в альбомной ориентации, но вместо этого отображается портретное изображение. Я решил проблему, заставив портретный вид появиться, обнаружив лицо вверх и вниз, но код Apple решил эту проблему (а также аналогичную проблему с фильмом, которую я также испытывал).

Большое спасибо за сообщение об ошибке - я предположил, что это просто мое плохое кодирование...