14

Estoy desarrollando una aplicación de iPhone que admite la reproducción de video. Estoy usando MPMoviePlayerController con controles personalizados para reproducir el video. Para este propósito, establecí el estilo de control de MPMoviePlayerController en MPMovieControlStyleNone.Compatibilidad con AirPlay, MPMoviePlayerController y la relación MPVolumeView

Me gustaría apoyar la función AirPlay para el video que se está reproduciendo. Según la documentación, tenemos que establecer la propiedad 'allowsAirPlay' de MPMoviePlayerController en SÍ para habilitar la función AirPlay. ¿Cómo puedo mostrar el botón AirPlay en mi IU de jugador si estoy usando MPMoviePlayerController con controles personalizados?

He intentado lo siguiente:

  1. crea la instancia MPVolumeView
  2. Establecer las propiedades showsRouteButton y showsVolumeSlider de MPVolumeView en NO para ocultar el control deslizante de volumen y el botón de ruta
  3. Agregado MPVolumeView en mi reproductor personalizado Ver

No he dado la referencia de MPVolumeView y MPMoviePlayerController entre sí. Pero, si 'allowsAirPlay' de MPMoviePlayerController está establecido en SÍ, entonces el botón AirPlay se muestra en MPVolumeView. ¿Cómo se relacionan MPVolumeView y MPMoviePlayerController? Por favor, hágame saber la conexión entre estas dos clases que se crean de forma independiente.

Gracias y Saludos, Deepa

+0

¿Alguna actualización sobre esto? – spd

+0

No se puede con una barra de control personalizada. El único lugar donde puede mostrar el botón Airplay (sin alterar el código de Apple) es mediante el uso de la barra de control estándar. – lostInTransit

+0

esperemos que esto se solucione con las actualizaciones de AirPlay en 5.0 –

Respuesta

10

Dado que el MPMoviePlayerController solo le permite reproducir un video a la vez, el marco de MediaPlayer siempre conoce el video que se está reproduciendo. Así es como MPVolumeView sabe sobre MPMoviePlayerController. No tengo documentos oficiales, pero me imagino que está incluido en el marco de esta manera.

Dado que probablemente haya muchos controles y equilibrios (y adoran las IU consistentes), Apple solo le permite usar su botón/IU de AirPlay para acceder a esta función. Puede, sin embargo, puesto que el botón donde quiera que desee:

airplayButton = [[MPVolumeView alloc] init]; 
airplayButton.frame = CGRectMake(myX, myY, 40, 40); 
[airplayButton setShowsVolumeSlider:NO]; 
[customPlayerControls.view addSubview:airplayButton]; 

acabo adiviné en la anchura, la altura de ser 40,40 y estoy seguro que no es correcto, pero una vez que el botón en su lugar se dejase no importa

+0

Pero esto no responde a mi pregunta – spd

+2

Hace dos preguntas: > ¿Cómo puedo mostrar el botón AirPlay en la interfaz de usuario de mi reproductor si estoy usando MPMoviePlayerController con controles personalizados? El fragmento de código responde esto. Crea una instancia de MPVolumeView, oculta su deslizador de volumen, te queda el botón Airplay. Establezca su marco y agréguelo a la vista. Esto pone un botón Airplay completamente funcional en tus controles. Solo aparece si hay un dispositivo habilitado para Airplay en el rango. [Para cambiar la apariencia]: http://stackoverflow.com/questions/5730973/airplay-support-mpmovieplayercontroller-and-mpvolumeview-relation/6988562#6988562 – devdavid

+0

> ¿Cómo se relacionan MPVolumeView y MPMoviePlayerController? Ambos son parte del marco de MediaPlayer, por lo tanto, cuando un MPMoviePlayerController está reproduciendo una película, el marco "sabe" al respecto. Como MPVolumeView está en el marco, "sabe" al respecto. Es por eso que no necesita pasar ninguna referencia del MPMoviePlayerController al botón Airplay, ya lo sabe. – devdavid

2
for (UIButton *button in volumeView.subviews) { 
if ([button isKindOfClass:[UIButton class]]) { 
    [button setImage:[UIImage imageNamed:@"custom-route-button.png"] forState:UIControlStateNormal]; 
    [button sizeToFit]; 
}} 

creo que esto le ayudará.

+0

Esta solución tiene potencial para el rechazo de aplicaciones por parte de Apple. Sin embargo, actualmente es la única solución disponible. +1 – Till

+0

@Till: como esta solución no usa ninguna API privada, Apple no la rechazará. De hecho, hacemos cosas similares (personalizamos el deslizador de volumen) y otras aplicaciones también lo hacen. Si Apple elige cambiar el diseño para que el botón no sea una subvista directa, el código simplemente ya no funcionará, pero no hará nada dañino. – DarkDust

+0

@DarkDust utilizando métodos API no privados no previene el rechazo. La modificación de los controles estándar de Apple donde obviamente no es la intención de Apple también promueve ese riesgo. Aún así, esta solución funciona y ** actualmente ** no está sujeta a rechazo por parte de Apple. – Till

0

La respuesta es: no se puede. No existe un método oficial a partir de iOS 4.3 para proporcionar sus propios controles para Airplay; necesita usar los controles estándar si necesita esa funcionalidad.

2

MPVolumeView tiene un atributo para ocultar el control deslizante de volumen y para mostrar el botón Ruta. Entonces no hay necesidad de atravesar las vistas que ocultan cosas.

MPVolumeView *volumeView = [[[MPVolumeView alloc] initWithFrame:myContainerView.bounds] autorelease]; 
volumeView.showsVolumeSlider = NO; 
volumeView.showsRouteButton = YES; 
[myContainerView addSubview:volumeView]; 

La colocación del botón de AirPlay (ruta) puede que no sea el esperado por lo que puede que tenga que jugar el marco del contenedor ver un poco para llegar a donde usted lo desee.

+0

Tienes razón. Quería mostrarlo antes de que se reproduzca la película :( – spd

Cuestiones relacionadas