MPMoviePlayer закрывается при нажатии
-
22-09-2019 - |
Вопрос
У меня есть настройка MPMoviePlayer для воспроизведения вступительного фильма к моему приложению.Это работает просто великолепно, единственная проблема в том, что оно длится 14 секунд, и я хочу дать пользователям возможность пропустить вступление, нажав в любом месте фильма.
Элементы управления фильмом я скрыл, так как они не нужны.
Код:
NSString *introPath = [[NSBundle mainBundle] pathForResource:@"intro" ofType:@"mov"];
intro = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:introPath]];
[intro setMovieControlMode:MPMovieControlModeHidden];
[intro play];
Спасибо!
Решение
РЕДАКТИРОВАТЬ:Мое первоначальное решение не сработает, поскольку фильм отображается во втором окне, расположенном поверх главного окна приложения (на iPhone в иерархии представлений очень редко бывает более одного окна).Это решение, основанное на Пример кода Apple MoviePlayer, работает:
. . .
// assuming you have prepared your movie player, as in the question
[self.intro play];
NSArray* windows = [[UIApplication sharedApplication] windows];
// There should be more than one window, because the movie plays in its own window
if ([windows count] > 1)
{
// The movie's window is the one that is active
UIWindow* moviePlayerWindow = [[UIApplication sharedApplication] keyWindow];
// Now we create an invisible control with the same size as the window
UIControl* overlay = [[[UIControl alloc] initWithFrame:moviePlayerWindow.frame]autorelease];
// We want to get notified whenever the overlay control is touched
[overlay addTarget:self action:@selector(movieWindowTouched:) forControlEvents:UIControlEventTouchDown];
// Add the overlay to the window's subviews
[moviePlayerWindow addSubview:overlay];
}
. . .
// This is the method we registered to be called when the movie window is touched
-(void)movieWindowTouched:(UIControl*)sender
{
[self.intro stop];
}
Примечание:Ссылку на проигрыватель фильмов необходимо сохранить в переменной экземпляра, а удобнее всего объявить свойство, которое мы сможем использовать для доступа к нему.Вот почему использование self.intro
вместо того, чтобы просто intro
в примере.Если вы не знаете, как объявить переменную экземпляра и свойство, на этом сайте и в других местах есть много информации.
****ОРИГИНАЛЬНЫЙ ОТВЕТ НИЖЕ
(Не работает в данном случае, но во многих подобных сценариях, поэтому я оставлю это как предупреждение и/или вдохновляющий пример.)
...если ничего больше не работает, я бы рекомендовал создать подкласс UIWindow и убедиться, что делегат вашего приложения создает его экземпляр вместо обычного UIWindow.Вы можете перехватывать прикосновения в этом классе и отправлять уведомление или напрямую отменять фильм (если вы сохранили указатель на MPMoviePlayer в ivar вашего подкласса окна).
@interface MyWindow : UIWindow {
}
@end
@implementation MyWindow
// All touch events get passed through this method
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
// The screen has been touched, send a notification or stop the movie
return [super hitTest:point withEvent:event];
}
@end