Pregunta

Tengo una configuración MPMoviePlayer para reproducir una película de introducción a mi solicitud. Que funciona muy bien, el único problema es que tiene una duración de 14 segundos, y yo quiero dar a mis usuarios la oportunidad de saltar la introducción pulsando en cualquier parte de la película.

He ocultado los controles de la película, ya que no son necesarios.

Código:

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

Gracias!

¿Fue útil?

Solución

EDIT: Mi solución inicial no va a funcionar, porque la película se muestra en una segunda ventana, en capas en la parte superior de la ventana principal de la aplicación (que es muy raro tener más de una ventana en la jerarquía de vistas en el iPhone). Esta solución, basada en de Apple código de ejemplo MoviePlayer , funciona :

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

Nota: Debe guardar la referencia al reproductor de películas en una variable de instancia, y es más conveniente para declarar una propiedad que podemos utilizar para acceder a ella. Es por eso que es el uso self.intro en lugar de sólo intro en el ejemplo. Si usted no sabe cómo declarar una variable de instancia y una propiedad, hay un montón de información en este sitio y en otros lugares.

**** ORIGINAL respuesta a continuación

(no funciona en este caso, pero en muchos escenarios similares, así que lo dejaré como una advertencia y / o inspirador ejemplo.)

. . . si nada más funciona me gustaría recomendar la subclasificación UIWindow y asegurarse de que sus crea la instancia de aplicación de los delegados que en lugar de un UIWindow normal. Puede interceptar toques en esa clase y enviar una notificación o cancelar la película directamente (si se ha almacenado un puntero a la MPMoviePlayer en una Ivar en su subclase ventana).

@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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top