Я пытаюсь правильно воспроизвести встроенное воспроизведение видео с помощью панели вкладок. В моем конкретном случае видео должно отображаться не в полноэкранном режиме на UIView, размещенном на UIViewController, управляемом UITabBarController.
Для упрощения примера, скажем, у меня есть две вкладки в моей панели вкладок. Первый показывает некоторые случайные вещи, второй показывает viewcontroller, который содержит встроенное видео.
Как только пользователь выбирает вторую вкладку, видео загружается и воспроизводится правильно.
Для инициализации проигрывателя я использую следующий код из моего производного класса UIView, запускаемого инициализатором (initWithFrame):
- (void)initPlayback
{
self.movieViewController = [[MPMoviePlayerViewController alloc] init];
movieViewController_.wantsFullScreenLayout = NO;
movieViewController_.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
[self addSubview:self.movieViewController.view];
}
Для запуска воспроизведения я использую следующий код, запускаемый методом viewWillAppear моего производного класса UIViewController:
- (void)playVideo
{
[movieViewController_.moviePlayer setContentURL:fileURL_];
}
Если затем пользователь выбирает первую вкладку (пока видео все еще воспроизводится), я удостоверяюсь, что видео остановлено, поскольку оно продолжит воспроизведение, если это не было сделано:
- (void)stopVideo
{
[movieViewController_.moviePlayer stop];
}
Когда пользователь снова выбирает вторую вкладку, представление остается пустым, ничего не загружается и не воспроизводится, даже если вызывается метод playVideo.
Чего мне не хватает, почему не удается воспроизвести видео при повторном выборе второй вкладки?
========== новая попытка =============
На этот раз я перестал полагаться на автоматическое воспроизведение (как было предложено), но это не имело значения.
Адаптированный и добавленный код для этого;
- (void)MPMoviePlayerLoadStateDidChange:(NSNotification *)notification
{
if (movieViewController_.moviePlayer.loadState == MPMovieLoadStatePlayable &&
movieViewController_.moviePlayer.playbackState != MPMoviePlaybackStatePlaying)
{
[movieViewController_.moviePlayer play];
}
}
- (void)deregisterFromNotifications
{
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerLoadStateDidChangeNotification
object:nil];
}
- (void)registerForNotifications
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(MPMoviePlayerLoadStateDidChange:)
name:MPMoviePlayerLoadStateDidChangeNotification
object:nil];
}
- (void)initPlayback
{
NSLog(@"playback init...");
self.movieViewController = [[MPMoviePlayerViewController alloc] init];
movieViewController_.wantsFullScreenLayout = NO;
movieViewController_.moviePlayer.shouldAutoplay = NO;
movieViewController_.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
movieViewController_.moviePlayer.currentPlaybackTime = 0.0f;
[self addSubview:movieViewController_.view];
}
- (void)playVideo
{
NSLog(@"playback starting...");
[self registerForNotifications];
[movieViewController_.moviePlayer setContentURL:fileURL_];
}
- (void)stopVideo
{
NSLog(@"playback stopping...");
[movieViewController_.moviePlayer stop];
[self deregisterFromNotifications];
}