Наложение поверх потокового 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];
}
}