#iphone #ios #ipad #mpmovieplayercontroller
#iPhone #iOS #iPad #mpmovieplayercontroller
Вопрос:
У меня есть универсальное приложение, которое воспроизводит фильмы из Интернета. Он должен поддерживать 3.1.x, а также 4.x.
Чтобы заставить это работать, у меня есть ветка в коде, которая обнаруживает устройства до версии 3.2 и использует MPMoviePlayerController
так, как это должно там работать.
Вот как я готовлю проигрыватель к удаленному воспроизведению фильма:
- (void)registerForMovieNotifications {
//for 3.2 devices and above
if ([moviePlayer respondsToSelector:@selector(loadState)]) {
LOG(@"moviePlayer responds to loadState, this is a 3.2 device");
//register the notification that the movie is ready to play
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayerLoadStateChanged:)
name:MPMoviePlayerLoadStateDidChangeNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(didExitFullScreen:)
name:MPMoviePlayerDidExitFullscreenNotification
object:nil];
LOG(@"preparing moviePlayer...");
[moviePlayer prepareToPlay];
} else {
//for pre-3.2 devices
LOG(@"This is a 3.1.x device");
//register the notification that the movie is ready to play
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePreloadDidFinish:)
name:MPMoviePlayerContentPreloadDidFinishNotification
object:nil];
}
//handle when the movie finished
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayBackDidFinish:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:nil];
}
- (void)readyPlayer {
if (!moviePlayer) {
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
} else {
[moviePlayer setContentURL:movieURL];
}
[self registerForMovieNotifications];
}
Позже я получаю это уведомление, и оно настраивает просмотр видеопроигрывателя и т.д.
- (void) moviePlayerLoadStateChanged:(NSNotification*)notification {
LOG(@"3.2/4.x - moviePlayerLoadStateChanged:");
//unless state is unknown, start playback
if ([moviePlayer loadState] != MPMovieLoadStateUnknown) {
//remove observer
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerLoadStateDidChangeNotification
object:nil];
//set the frame of the movie player to match
self.view.autoresizesSubviews = YES;
[[moviePlayer view] setFrame:self.view.bounds];
[[moviePlayer view] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
[[moviePlayer view] setAutoresizesSubviews:YES];
//add movie player as a subview
[self.view addSubview:moviePlayer.view];
[moviePlayer setFullscreen:YES];
//play the movie
[moviePlayer play];
}
}
И фильм воспроизводится. Это отлично работает на iPhone 4.2, 4.3, iPad 4.2, 4.3, но на iPad 3.2 происходит сбой. Фильм воспроизводится, но все, что я получаю, это черный экран.
Если я удалю [moviePlayer setFullscreen:YES]
вызов, я получу видимый воспроизводимый фильм в версии 3.2, однако он не «полноэкранный», и поэтому на нем нет кнопки «Готово», и у меня нет возможности отключить экран.
Я бы хотел получить некоторую помощь в том, что здесь происходит. Спасибо!
Комментарии:
1. Жаль, что у меня нет устройства под управлением 3.2, чтобы протестировать это для вас. Похоже, что это может быть ошибка в 3.2. Вы пробовали вызывать
setFullscreen:animated:
вместо этого, на всякий случай?2. Удалите всю обработку просмотра из обработчика уведомлений. Остается только метод воспроизведения MoviePlayer. Сделайте это для просмотра ранее. hth
3. @Nathan — да, я пробовал это 🙂
Ответ №1:
Я смог прийти к приемлемому решению, но я все еще чувствую, что это может быть ошибкой.
Если я пропущу вызов setFullScreen
и вместо этого просто вручную установлю controlStyle
значение MPMovieControlStyleFullScreen
, то это даст мне в основном правильное представление (панель инструментов находится примерно на 40 пикселей ниже, чем нужно).
Затем я могу нажать кнопку «Готово», которая запускает moviePlayer:didFinishPlaying
обратный вызов.
Итак, это воняет, теперь у меня в моем коде вонючая if 3.2
ветвь логики, но, надеюсь, большинство людей все равно будут на 4.0.