Наложение поверх потокового MPMoviePlayerController - PullRequest
5 голосов
/ 31 августа 2009

Я прошел пример с яблока "MoviePlayer на iPhone"

Я пытаюсь наложить поверх контроллера mpmovieplayer,

отлично работает с видеоклипом в комплекте,

но это не сработает, если я транслирую видео с URL.

вид наложения просто скрывается за игроком.

Есть ли способ вывести вид наложения вперед?

Ответы [ 4 ]

11 голосов
/ 07 сентября 2009

MPMoviePlayerController создает свое собственное окно и устанавливает его в качестве ключевого окна - вы, вероятно, знаете это уже из примера приложения MoviePlayer.

Я не знаю почему, но есть задержка, когда проигрыватель использует поток - поэтому ключевое окно, которое вы получаете сразу после инициализации проигрывателя, скорее всего, не окно проигрывателя, так как оно, кажется, добавляется позже.

Вы можете «обмануть» и использовать таймер, чтобы через несколько секунд открыть окно плеера, и добавить свой оверлей:

[NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(addMyOverlay:) userInfo:nil repeats:FALSE]

Или вы можете прослушать событие UIWindowDidBecomeKeyNotification и сделать то же самое:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyWindowChanged:) name:UIWindowDidBecomeKeyNotification object:nil];

Ни один из вариантов не является отличным (я бы хотел знать более чистый способ сделать это), но он выполняет свою работу.

3 голосов
/ 31 марта 2010

Вы можете наложить свой вид, когда получаете уведомление «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];
    }
}
2 голосов
/ 30 сентября 2010

Очень простое решение:

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

Это сохранит пользовательский интерфейс вашего приложения поверх окна видео.

мой пост

1 голос
/ 20 октября 2009

Предыдущий ответ был основан на таймере. & исправлено 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];
    }
}
...