Frage

Ich habe einen MPMoviePlayer Setup einen Intro-Film auf meine Anwendung zu spielen. Das funktioniert einfach toll, das einzige Problem ist, dass es für 14 Sekunden dauert, und ich möchte, dass meine Benutzer eine Möglichkeit geben, das Intro zu überspringen, indem Sie eine beliebige Stelle auf dem Film zu drücken.

Ich habe den Film Kontrollen versteckt, da sie nicht benötigt werden.

Code:

NSString *introPath = [[NSBundle mainBundle] pathForResource:@"intro" ofType:@"mov"];
intro = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:introPath]];
[intro setMovieControlMode:MPMovieControlModeHidden];
[intro play]; 

Danke!

War es hilfreich?

Lösung

EDIT: Meine erste Lösung wird nicht funktionieren, weil der Film in einem zweiten Fenster angezeigt wird, geschichtet oben auf die Hauptfenster der Anwendung (es ist sehr selten mehr als ein Fenster in der Ansicht Hierarchie auf dem iPhone zu haben). Diese Lösung basiert auf Apple Movieplayer Beispielcode , funktioniert :

. . .
    // 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];
}

Hinweis: Sie müssen den Verweis auf den Video-Player in einer Instanzvariablen speichern, und es ist sehr bequem, eine Eigenschaft zu erklären, dass wir auf ihn zugreifen können. Deshalb verwenden self.intro statt nur intro im Beispiel. Wenn Sie nicht wissen, wie eine Instanz Variable zu deklarieren und eine Eigenschaft, gibt es eine Fülle von Informationen auf dieser Website und anderswo.

**** ORIGINAL Antwort unten

(nicht funktioniert in diesem Fall, aber in vielen ähnlichen Szenarien, so dass ich es als Warnung verlassen werden und / oder inspirierendes Beispiel.)

. . . wenn sonst nichts funktioniert würde ich Subklassen UIWindow und dafür sorgen, dass AppDelegate Instantiiert empfehlen, anstelle eines normalen UIWindow. Sie können Berührungen in dieser Klasse abfangen und eine Benachrichtigung senden oder den Film direkt abbrechen (wenn Sie einen Zeiger auf die MPMoviePlayer in einem Ivar auf Ihrer Fensterunterklasse gespeichert haben).

@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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top