2010-09-06 15 views

Respuesta

5

Se podría ocultar los controles de reproducción y añadir sus propios los personalizados, esto evitará que los botones predeterminados que se queden en absoluto

es decir, con

[player setMovieControlMode:MPMovieControlModeNone]; 
7

Dependiendo de sus necesidades, también puede simplemente desactivar todas las interacciones del usuario en la vista del jugador.

player.view.userInteractionEnabled = NO; 
2

Wired does this. Para los videos que comienzan en pantalla completa, tienen los controles estándar MPMoviePlayerController, pero faltan los botones de pantalla completa. Y están usando los integrados estándar, ya que de repente obtuvieron un botón AirPlay con 4.2.

4

Hay una trampa:

MPMoviePlayerController *mpc = (...some instance...) 
UIView *fsbutton = [[mpc view] viewWithTag:512]; 
[fsbutton setHidden:YES]; 

La captura principal es, usted tiene que hacerlo en viewDidAppear: o similares, porque la vista MoviePlayer erige en algún lugar dentro didMoveToWindow o didMoveToSuperview, lo que ocurra después de viewWillAppear:. Entonces obtienes un breve destello del botón de pantalla completa. Otras capturas obvias incluyen: frágil vs. Apple cambiando el valor de la etiqueta 512 (aunque funciona en 3.2 - 4.2); y por supuesto, Apple preferiría que no hicieras esto.

La solución endosada es establecer el estilo de control en MPMovieControlStyleNone y hacer rodar sus propios controles de transporte, lo cual es más trabajo.

+1

El otro problema es que el gesto de pellizcar para acercar, que también lleva al usuario a pantalla completa, evita esta bella idea. – Roger

+0

y tratar de eliminar los gestos – SAKrisT

+1

Apple probablemente rechazará su aplicación si intenta modificar el MPMovePlayerController más allá de la API pública. Aquí hay una cita de [documentos de Apple] (https://developer.apple.com/library/ios/documentation/MediaPlayer/Reference/MPMoviePlayerController_Class/Reference/Reference.html): "Considere que una vista de reproductor de películas es opaca Puedes agregar tus propias subvistas personalizadas al contenido de la capa en la parte superior de la película, pero ** nunca debes modificar ninguna de sus subvistas existentes. ** " – n8tr

11

sólo lo hizo:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(movieEventFullscreenHandler:) 
               name:MPMoviePlayerWillEnterFullscreenNotification 
               object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(movieEventFullscreenHandler:) 
               name:MPMoviePlayerDidEnterFullscreenNotification 
               object:nil]; 

    self.moviePlayer.controlStyle = MPMovieControlStyleEmbedded; 
} 

- (void)movieEventFullscreenHandler:(NSNotification*)notification { 
    [self.moviePlayer setFullscreen:NO animated:NO]; 
    [self.moviePlayer setControlStyle:MPMovieControlStyleEmbedded]; 
} 
+4

Buena idea, pensé que podría usar esto para activar una alerta y explicar por qué pantalla completa no se permitió en el contexto actual y lo fuerza a permanecer en modo incrustado. Lamentablemente, lo que sucede en realidad es que todavía obtienes la transición a pantalla completa y luego vuelve a ser incrustado, lo que se ve realmente horrible. – Roger

+0

Solo traté de hacer esto, pero desafortunadamente la pantalla completa ignora el MPMovieControlStyleEmbedded y usa FullScreen, que cuando cambio a pantalla completa, va aún más grande :( – lordB8r

2

botón de pantalla completa junto con el botón de pausa se puede quitar.

[self.videoPlayer setControlStyle:MPMovieControlStyleNone]; 
3

con el fin de desactivar el interruptor de modo de pantalla completa, ya sea botón de formulario o gesto de pellizco, puede utilizar esto:

moviePlayer.controlStyle = MPMovieControlStyleNone; 
moviePlayer.view.userInteractionEnabled =NO; 
0

lo sé, es un poco anticuado, pero de todos modos. Hice algunas investigaciones en esa dirección, y parece que encontré una respuesta. No sé, por qué funciona, pero lo es.

-(void) playMovieAtURL: (NSURL*) theURL { 

    MPMoviePlayerController* theMovie = 
    [[MPMoviePlayerController alloc] initWithContentURL: theURL]; 
    //That line is for ARC. Without it, it may not work. 
    self.moviePlayer = theMovie; 
    theMovie.scalingMode = MPMovieScalingModeAspectFill; 
    theMovie.controlStyle = MPMovieControlStyleFullscreen; 
    theMovie.repeatMode = MPMovieRepeatModeOne; 
    //Here you'd better use your custom ViewController subclass, if you want autorotating and all that stuff. 
    UIViewController * vc = [UIViewController new]; 
    [vc.view addSubview:theMovie.view]; 
    theMovie.fullscreen = YES; 
    theMovie.view.frame = vc.view.bounds; 
    vc.view = theMovie.view; 
    [self presentModalViewController:vc animated:YES]; 
    theMovie.fullscreen = YES; 

    [theMovie prepareToPlay]; 
    [theMovie play]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMovieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; 
} 

// Cuando la película está lista, suelte el controlador.

-(void) myMovieFinishedCallback: (NSNotification*) aNotification 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
    MPMoviePlayerController* theMovie = [aNotification object]; 
    [[NSNotificationCenter defaultCenter] 
removeObserver: self 
name: MPMoviePlayerPlaybackDidFinishNotification 
object: theMovie]; 
    [self.moviePlayer.view removeFromSuperview]; 
    self.moviePlayer = nil; 
    // Release the movie instance created in playMovieAtURL: 
} 
1

Si lo única que quieres hacer es desactivar el pellizco a ir a pantalla completa (es decir,mantener la interacción habilitado y sea cual sea el estilo de control que desee), puede utilizar esto:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    NSSet *set = [event allTouches]; 
    NSArray *arr = [set allObjects]; 
    for (int i = 0; i < arr.count; i++) { 
     UITouch *touch = (UITouch *) [arr objectAtIndex:i]; 

     NSArray *recognisers = touch.gestureRecognizers; 
     for (UIGestureRecognizer *recogniser in recognisers) { 
      if (recogniser.enabled && [recogniser isMemberOfClass:[UIPinchGestureRecognizer class]]) { 
       recogniser.enabled = NO; 
      } 
     } 
    } 
} 
2

bloque simple para eliminar pizca de zoom aquí

espero que ayude

que funcione conmigo en iOS6

for (UIView *view in moviePlayer.view.subviews) { 

    for(UIPinchGestureRecognizer *pinch in view.gestureRecognizers){ 
    if([pinch isKindOfClass:[UIPinchGestureRecognizer class]]) 
     [view removeGestureRecognizer:pinch]; 
    } 
} 
6

Puede establecer controlStyle en Pantalla completa. estos controles son algo diferentes, ¡pero no cuentan con un botón de pantalla completa!

[_moviePlayerController setControlStyle:MPMovieControlStyleFullscreen]; 
+0

Genius! Esta definitivamente es la mejor respuesta. – PICyourBrain

2

Esto funcionó en iOS 7, iPhone 5s.

Add Notification: 

MPMoviePlayerDidEnterFullscreenNotification : @"moviePlayFullscreenNote:" 

- (void)moviePlayFullscreenNote:(NSNotification*)notification 
{ 
    if (notification.object == self.videoPlayer) 
    { 
     [self.videoPlayer setFullscreen:NO animated:YES]; 
     self.videoPlayer.controlStyle = MPMovieControlStyleEmbedded; 
    } 
} 

Tenga en cuenta que solo escucho "DID" y no la notificación de "VOLUNTAD", además de ejecutarla animada. Creo que esto funciona, ya que le da tiempo al sistema para reaccionar. Cuando usé "VOL" y "HIZO" como se indica en las respuestas anteriores, se generó una pantalla negra sin controles. Hay un pequeño problema que es visible cuando se produce la transición, pero necesito que los botones reproducir/restregar estén incrustados.

5

Desafortunadamente ninguno de arriba me funcionó correctamente, así que escoger lo anterior he implementado la siguiente (y funcionaba bien):

  1. ocultar el botón de pantalla completa.

Agregue este código en el método donde inicializa el reproductor de películas.

 

    .... 

     //Because we have to wait until controllers are shown 

     [self performSelector:@selector(hideFullscreenButton) withObject:self afterDelay:0.5]; 

    ... 

Añadir los métodos:

 

    -(void) hideFullscreenButton{ 

     //Hide full screen mode button 

     [self hideFullscreenSubview:movieClip.view.subviews]; 

    } 



    -(void) hideFullscreenSubview:(NSArray*)arr{ 

     for(UIView *v in arr){ 

      if([v.subviews count]>0) 

       [self hideFullscreenSubview:v.subviews]; 

      else 

       NSLog(@"%@",v); 

      if(v.frame.origin.x==975){ 

       v.hidden=TRUE; 

      } 

     } 

    } 

El problema se basa en que no hay ninguna etiqueta para identificar qué ver lo que tiene que ocultar. En mi caso lo averiguo por las coordenadas de vista.

  1. Sobrescribe los gestos del grifo para no permitir el zoom a pantalla completa.
 

movieClip.controlStyle = MPMovieControlStyleEmbedded;  

    //Disable tap for not allowing that video control set on a full screen mode. 
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget: self action:@selector(doSingleTap)]; 
    singleTap.numberOfTapsRequired = 1; 
    [movieClip.view addGestureRecognizer:singleTap]; 



    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget: self action:@selector(doDoubleTap)]; 
    doubleTap.numberOfTapsRequired = 2; 
    [movieClip.view addGestureRecognizer:doubleTap]; 
    [singleTap requireGestureRecognizerToFail:doubleTap]; 

y añadir los métodos de selección de:

 

    -(void) doSingleTap{ 
     //DO NOTHING!!! 
    } 

    -(void) doDoubleTap{ 
     //DO NOTHING!!! 
    } 

+0

La primera solución funcionó perfecta para mí, ¡En la parte inferior, la versión Swift – diegomen

+0

oculta el scrubber, no el botón de pantalla completa –

0

poner un UIView o UIButton con fondo transparente en la parte superior de la vista que muestra el video, por lo que el usuario no será capaz de toque la vista que contiene el video.

1

Esta es la versión Swift de la primera solución de Javier Calatrava Llavería:

func hideFullScreenButton() { 
    self.hideFullScreenSubview((self.moviePlayerController?.view.subviews)!) 
} 

func hideFullScreenSubview(subviews: [UIView]) { 
    for view: UIView in subviews { 
     if view.subviews.count > 0 { 
      self.hideFullScreenSubview(view.subviews) 
     } 
     if view.frame.origin.x == 631 { 
      view.hidden = true 
     } 
    } 
} 

Y cuando el usuario toca en Play:

self.performSelector(#selector(VideoViewController.hideFullScreenButton), withObject: self, afterDelay: 0.5) 

(VideoViewController es el controlador de vista en el que tengo MPMoviePlayerController)