叠加在流的MPMoviePlayerController的顶部(Overlay on top of

2019-07-04 03:06发布

我通过例如去苹果“iPhone上的MoviePlayer”

我试着去覆盖上的MPMoviePlayerController的顶部,

它完美的作品与视频剪辑是捆绑,

但如果我流从URL视频不会工作。

覆盖视图只会得到隐藏玩家后面。

有没有办法带来的叠加视图高达面前?

Answer 1:

的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];

无论选择是伟大的(我很想知道一个更清洁的方式来做到这一点),但它能够完成任务。



Answer 2:

当您收到“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];
    }
}


Answer 3:

一个非常简单的解决方案:

appDelegate.window.backgroundColor = [UIColor clearColor];
appDelegate.window.windowLevel = 2;

这将保持在视频窗口的顶部您的应用程序UI。

我的文章



Answer 4:

以前的答案是基于定时器。 &固定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];
    }
}


文章来源: Overlay on top of Streaming MPMoviePlayerController