Наложение поверх потокового MPMoviePlayerController

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

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

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

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

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

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

4 ответа

Решение

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

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

Вы можете наложить свое представление, когда получаете уведомление "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;

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

мой пост

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