我正在尝试在标签栏导航中正确实现嵌入式视频播放。在我的具体情况下,视频应以非全屏方式显示在由 UIViewController 托管、由 UITabBarController 管理的 UIView 上。
为了简化示例,假设我的标签栏中有两个标签。第一个显示一些随机的东西,第二个显示托管嵌入视频的视图控制器。
一旦用户选择第二个选项卡,视频就会正常加载和播放。
为了初始化播放器,我在我的 UIView 派生类中使用以下代码,由初始化程序 (initWithFrame) 触发:
- (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];
}
一旦用户再次选择第二个选项卡,视图将保持空白,即使调用了 playVideo 方法,也不会加载或播放任何内容。
我错过了什么,为什么重新选择第二个选项卡时视频播放失败?
==========新尝试==============
这次我不再依赖 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];
}