¿Cómo hago una barra ahora de reproducción como en las aplicaciones de reproductor de medios en iOS con XCode?

Estoy haciendo una aplicación de reproductor multimedia. Tengo UITableViewControllers que están integrados en el controller de navigation. Me gustaría hacer de alguna manera una vista que superponga potencialmente múltiples (2?) De estos tableviewcontrollers (uno que muestra las lists de reproducción del usuario, y el siguiente mostraría las pistas en la list de reproducción), pero solo en la parte inferior, como ahora barra en (por ejemplo) la aplicación de iOS de Spotify (como en la parte inferior izquierda de este

introduzca la descripción de la imagen aquí

o como en este

introduzca la descripción de la imagen aquí

He intentado arrastrar una vista de contenedor a mi controller de navigation (en el que está embedded mi TableViewCell), pero no me deja soltarlo allí.

Parece que puedo arrastrar la vista de contenedor a mi TableView, pero ¿cómo quedaría allí cuando navego entre vistas de table?

Tratando de seguir la sugerencia de @Rintaro, pero soy un poco nuevo en XCode. ¿Como hiciste esto? Así que hice una aplicación de vista única, agregué una vista de contenedor al primer VC, está inmigrando en otro lugar en el guión gráfico, pero no puedo imaginar cómo decirle a esa vista que es un controller de navigation. Además, tan pronto como agrego un segundo contenedor al primer VC e intenté dimensionarlo, ¡desaparece el primer contenedor! Todavía aparece en la list de la jerarquía de la izquierda y aún tiene una flecha apuntando hacia fuera, pero el controller de vista que se agregó y que se estaba señalando también es invisible?

introduzca la descripción de la imagen aquí

introduzca la descripción de la imagen aquí

ACTUALIZACIÓN: Esto funciona muy bien, pero tiene un problema con los cambios de orientación. ¿Cómo puedo hacer que esto funcione en ambas orientaciones? (Hipótesis que actualmente coloca la "vista de reproducción actual" fuera de la pantalla cuando cambia la orientación).

Básicamente , la jerarquía de vista así se construye así:

captura de pantalla

Utilizando dos "Contenedor de vista" en el controller de vista inicial, uno para el controller de navigation, otro para el controller de vista "Reproduciendo ahora".

ADICIONAL:

"Main Container View Controller" sería su propia subclass UIViewController . Tendrá la responsabilidad de mostrar / ocultar "Now Playing Bar".


Solución alternativa para comportamientos extraños de Interface Builder.

Puede establecer las restricciones de Diseño automático como sigue. Tal vez quiera seleccionar la vista desde el menu de la izquierda.

Tenga en count que, debe desmarcar la casilla Constrain to margins verificación Constrain to margins .

Vista de contenedor para el controller de navigation:

captura de pantalla

Vista de contenedor para jugar ahora Controlador de barra:

captura de pantalla

Y luego, Update Frames en el menu:

captura de pantalla

Si está colocando manualmente cualquier button con coorderadas absolutas, asegúrese de actualizar las coorderadas cuando se cambie la rotation.

Obviamente, necesita crear una class UIView personalizada, donde mostrará este menu. Y cuando lo creas, agrégalo a tu vista como aquí:

 float y = ROOTVC.view.frame.size.height - 49; [self setFrame:CGRectMake(0, y, 320, 49)]; [ROOTVC.view addSubview:self]; [ROOTVC.view bringSubviewToFront:self]; 

Simplemente agregaría un nowPlayingView a la nowPlayingView appDelegate.window y lo ajustaría:

  • El marco window.rootController.view para evitar la superposition de nowPlayingView .

  • Si window.rootController.view es un UIScrollView , ajuste its contentInset.bottom para evitar superponer el nowPlayingView . También puede usar transparencia / translucidez con esta solución.

  • Agregue una barra de herramientas simulada al controller que se verá cubierto por nowPlayingView .

Si su window.rootController es un UINavigationController , entonces probablemente tenga que hacer lo anterior para cada controller que presione. El nowPlayingView permanecerá sin cambios en la parte superior.