我浏览了苹果“MoviePlayer on iPhone”的例子
我试图覆盖在 mpmovieplayercontroller 之上,
它与捆绑的视频剪辑完美配合,
但如果我从 url 流式传输视频,它将无法工作。
覆盖视图只会隐藏在播放器后面。
有没有办法将覆盖视图放在前面?
我浏览了苹果“MoviePlayer on iPhone”的例子
我试图覆盖在 mpmovieplayercontroller 之上,
它与捆绑的视频剪辑完美配合,
但如果我从 url 流式传输视频,它将无法工作。
覆盖视图只会隐藏在播放器后面。
有没有办法将覆盖视图放在前面?
MPMoviePlayerController 创建自己的窗口并将其设置为关键窗口 - 您可能已经从 MoviePlayer 示例应用程序中知道了这一点。
我不知道为什么,但是当播放器使用流时会有延迟 - 所以你在初始化播放器后得到的 keyWindow 很可能不是播放器的窗口,因为它似乎是稍后添加的。
您可以“作弊”并使用计时器在几秒钟后获取播放器窗口,然后添加您的叠加层:
[NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(addMyOverlay:) userInfo:nil repeats:FALSE]
或者您可以侦听 UIWindowDidBecomeKeyNotification 事件,并执行相同操作:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyWindowChanged:) name:UIWindowDidBecomeKeyNotification object:nil];
这两种选择都不是很好(我很想知道一种更清洁的方法),但它可以完成工作。
当您收到“MPMoviePlayerContentPreloadDidFinishNotification”通知时,您可以覆盖您的视图。
注册通知:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePreloadDidFinish:)
name:MPMoviePlayerContentPreloadDidFinishNotification
object:nil];
收到通知时添加覆盖视图:
// Notification called when the movie finished preloading.
- (void) moviePreloadDidFinish:(NSNotification*)notification
{
NSArray *windows = [[UIApplication sharedApplication] windows];
if ([windows count] > 1)
{
// Locate the movie player window
UIWindow *moviePlayerWindow = [[UIApplication sharedApplication] keyWindow];
if ([moviePlayerWindow viewWithTag:0x3939] == nil) {
self.videoOverlayView.tag = 0x3939;
[moviePlayerWindow addSubview:self.videoOverlayView];
}
[moviePlayerWindow bringSubviewToFront:self.videoOverlayView];
}
}
一个非常简单的解决方案:
appDelegate.window.backgroundColor = [UIColor clearColor];
appDelegate.window.windowLevel = 2;
这将使您的应用程序 UI 保持在视频窗口的顶部。
以前的答案是基于计时器。& 固定 5 秒。
当电影播放器开始时,一个新窗口被添加到应用程序中。
使用计时器检查天气是否将新窗口添加到您的应用程序中。
添加窗口(电影播放器窗口)时。设置通知。
-(void)viewDidLoad{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePreloadDidFinish:)
name:MPMoviePlayerContentPreloadDidFinishNotification
object:nil];
// Register to receive a notification when the movie has finished playing.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayBackDidFinish:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:nil];
// Register to receive a notification when the movie scaling mode has changed.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(movieScalingModeDidChange:)
name:MPMoviePlayerScalingModeDidChangeNotification
object:nil];
videoListController.xmlClassVideoList=t;
// here ttttt is a timer declared in .h file
tttttt=[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(startMy) userInfo:nil repeats:YES];
}
-(void)startMy{
NSArray *windows = [[UIApplication sharedApplication] windows];
NSLog(@"%i",[windows count]);
// depends on your application window
// it may be 1/2/3
if ([windows count] > 3) {
// Locate the movie player window
[tttttt invalidate];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyWindowChanged:) name:UIWindowDidBecomeKeyNotification object:nil];
}
}