我正在尝试使用MPMoviePlayerController类播放两个视频,并允许用户通过在屏幕上滑动手指来切换两个视频。一切都适合第一部电影。叠加视图正确检测到滑动并开始播放下一部电影。
不幸的是,第二部电影的效果并不好。我不确定发生了什么,但叠加视图实际上似乎并不在电影播放器之上,并且肯定没有响应触摸事件。实际上,在播放第二部电影时双击屏幕可以放大和缩小电影,所以触摸似乎是要转到MPMoviePlayerController。
我在这里尝试了许多不同的方法,但它们都不起作用。以下是代码的当前版本:
- (void)allocateMoviePlayerForCurrentVideo
{
// Create a movie player for the first video in the playlist
NSURL *url = [videoURLs objectAtIndex:nowPlayingVideoIndex];
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];
moviePlayer.scalingMode = MPMovieScalingModeAspectFill;
moviePlayer.movieControlMode = MPMovieControlModeHidden;
moviePlayer.backgroundColor = [UIColor blackColor];
// Register for the movie preload complete notification
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePreloadComplete:)
name:MPMoviePlayerContentPreloadDidFinishNotification
object:nil];
// Register for the playback did finish notification
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(movieDidFinishPlaying:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:nil];
}
处理MPMoviePlayerContentPreloadDidFinishNotification的代码启动电影播放并添加叠加视图:
- (void)moviePreloadComplete:(NSNotification *)notification
{
// Remove this object from observing the preload complete notification
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerContentPreloadDidFinishNotification
object:nil];
// Start playing the current movie
[moviePlayer play];
// Add the overlay view to the movie player
UIWindow *moviePlayerWindow= [[[UIApplication sharedApplication] windows] objectAtIndex:1];
overlayView = [[GGDMovieOverlayView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
overlayView.backgroundColor = [UIColor clearColor];
[moviePlayerWindow addSubview:overlayView];
[moviePlayerWindow bringSubviewToFront:overlayView];
// Register for swipe notifications from the overlay view
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleMoviePlayerSwipeNotification:)
name:GGDMoviePlayerSwipeNotification
object:nil];
}
最后,这是处理滑动通知的例程:
- (void)handleMoviePlayerSwipeNotification:(NSNotification *)notification
{
// Stop the current movie player and release it
[moviePlayer stop];
[moviePlayer release];
moviePlayer = nil;
// Remove the overlay view from its superview
[overlayView removeFromSuperview];
// Advance to the next movie, treating the array of video URLs as a circular array
if ( ++nowPlayingVideoIndex == [videoURLs count] ) {
nowPlayingVideoIndex = 0;
}
[self allocateMoviePlayerForCurrentVideo];
}
我担心有一些明显的东西我不知道了,但这已经让我疯了一段时间了。我非常感谢任何帮助!
谢谢,
亚当
答案 0 :(得分:0)
通过使用NSTimer在延迟后添加叠加视图以确保电影已开始播放来修复。
谢谢,
亚当
答案 1 :(得分:0)
我亲自经历了这个问题,我可以解释这个问题,并提供一个稍好的解决方法。
按顺序运行下一部电影的问题是,在电影完成播放后获得的通知发生在从视图中删除当前电影播放器窗口之前。这是一个问题,因为(根据Apple示例)获取电影播放器窗口的唯一方法是抓住堆栈(或关键窗口)上的顶部窗口。但是如果你试着立即使用这种技术,你将会得到一个渐渐消失的旧电影播放器窗口,而不是新的电影播放器窗口。 (顺便说一句 - 坦率地说,苹果的例子是一个例子,根本没有正确的方法来获取电影窗口......他们的例子很糟糕,可能是一个竞争条件开始,除非某种方式播放方法阻止直到窗口实际上在堆栈上。)
无论如何,我所做的不是任意延迟,而是在首次创建时标记播放器窗口,例如。
UIWindow * moviePlayerWindow = [[UIApplication sharedApplication] keyWindow]; moviePlayerWindow.tag = MY_MOVIE_WINDOW_TAG; //这只是一个int
然后在moviePlaybackDidFinish方法中调用waitForMovieWindowToExit方法来查找该标记窗口。如果它仍然存在,那么我使用计时器在0.1秒内再次检查。当它最终消失时,我播放下一个序列。
所以,它仍然是一个烂摊子,仍然使用计时器,但至少你保证在下一个可能的时间0.1秒(或其他)内播放下一部电影,如果系统有点不会打破它慢等等。
如果有人想要更多代码我可以发布。