Наложение поверх Streaming MPMoviePlayerController

Я просмотрел пример из apple "MoviePlayer на iPhone".

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

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

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

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

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


person vicky    schedule 31.08.2009    source источник


Ответы (4)


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

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

person alex_c    schedule 06.09.2009
comment
на самом деле я использовал UIWindowDidBecomeKeyNotification, а не таймер, он отлично работает. таймер не нужен. - person vicky; 22.10.2009
comment
Хорошо я согласен. То, что ваше окно - решение идеальное. - person Sagar R. Kothari; 24.10.2009
comment
Я пробовал использовать как центр уведомлений, так и подход на основе таймера. В обоих случаях мой оверлей появляется, но с неправильным поворотом, то есть в ландшафтном режиме (который появляется в проигрывателе фильмов pre3.2) наложение появляется на экране, как будто я все еще в портретном режиме. У кого-нибудь есть опыт в этом? - person occulus; 03.06.2011

Вы можете наложить свое представление, когда получите уведомление «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];
    }
}
person Seunghoon    schedule 31.03.2010

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

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

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

мое сообщение

person MaxFish    schedule 30.09.2010

Предыдущий ответ был основан на таймере. & фиксированные 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];
    }
}
person Sagar R. Kothari    schedule 20.10.2009
comment
Я согласен с тем, что проверка каждые 0,5 с имеет больше смысла, чем ожидание 5 с, но почему бы просто не прослушать UIWindowDidBecomeKeyNotification с самого начала и забыть о таймере? - person alex_c; 21.10.2009