Вопрос

У меня есть настройка 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top