Domanda

Ho una configurazione MPMoviePlayer a svolgere un filmato introduttivo alla mia domanda. Che funziona solo grande, l'unico problema è che dura per 14 secondi, e voglio dare ai miei utenti la possibilità di saltare l'intro premendo in qualsiasi punto del film.

Ho nascosto i controlli di film, in quanto non sono necessari.

Codice:

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

Grazie!

È stato utile?

Soluzione

EDIT: La mia soluzione iniziale non funzionerà, perché il film è mostrato in una seconda finestra, sovrapposto della finestra principale dell'applicazione (è molto raro avere più di una finestra nella gerarchia vista su iPhone). Questa soluzione, basata su di Apple MoviePlayer codice di esempio , funziona :

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

NB: È necessario salvare il riferimento al lettore di film in una variabile di istanza, ed è più conveniente per dichiarare una proprietà che possiamo utilizzare per accedervi. Ecco perché è uso self.intro invece di intro nell'esempio. Se non sai come dichiarare una variabile di istanza e una proprietà, c'è un sacco di informazioni su questo sito e altrove.

**** risposta iniziale SOTTO

(non funziona in questo caso, ma in molti scenari simili, quindi lascio come un avvertimento e / o di esempio da seguire.)

. . . se non altro funziona io consiglierei di sottoclassi UIWindow e fare in modo che la vostra applicazione delegato un'istanza che invece di un UIWindow normale. È possibile intercettare tocchi in quella classe e inviare una notifica o annullare il filmato direttamente (se hai memorizzato un puntatore al MPMoviePlayer in un Ivar sulla vostra finestra sottoclasse).

@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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top