タブバーナビゲーション内に埋め込みビデオ再生を適切に実装しようとしています。私の特定のケースでは、ビデオは、UITabBarControllerによって管理されるUIViewControllerによってホストされるUIViewにフルスクリーンではない方法で表示されます。
例を単純化するために、タブバー内に2つのタブがあるとします。1つ目はランダムなものを示し、2つ目は埋め込みビデオをホストするビューコントローラーを示しています。
ユーザーが2番目のタブを選択すると、ビデオが正しく読み込まれ、再生されます。
プレーヤーを初期化するために、初期化子(initWithFrame)によってトリガーされる、UIView派生クラス内から次のコードを使用しています。
- (void)initPlayback
{
self.movieViewController = [[MPMoviePlayerViewController alloc] init];
movieViewController_.wantsFullScreenLayout = NO;
movieViewController_.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
[self addSubview:self.movieViewController.view];
}
再生を開始するために、UIViewController派生クラスのviewWillAppearメソッドによってトリガーされる次のコードを使用しています。
- (void)playVideo
{
[movieViewController_.moviePlayer setContentURL:fileURL_];
}
その場合、ユーザーが最初のタブを選択すると(ビデオの再生中に)、それが行われなかった場合に再生が継続されるため、ビデオが停止していることを確認しています。
- (void)stopVideo
{
[movieViewController_.moviePlayer stop];
}
ユーザーが2番目のタブを再度選択すると、ビューは空白のままになり、playVideoメソッドが呼び出されても何もロードまたは再生されません。
何が欠けていますか、2番目のタブを再選択したときにビデオの再生が失敗するのはなぜですか?
==========新しい試み=============
今回はshouldAutoplayに依存するのをやめました(提案されたように)が、それは違いを生みませんでした。
このためにコードを適応させて追加しました。
- (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];
}