Los carruseles son elementos visuales atractivos y funcionales, pero su programación puede parecer complicada si no se tiene el conocimiento previo. Sin embargo, al desarrollar uno, la creación de otros se vuelve un proceso simple, ya que comparten muchas similitudes. La clave está en entender cómo funcionan el scroll view y las imágenes. Aquí te mostraré cómo iniciar la creación de estos módulos de carrusel.
¿Cómo estructurar el contenido inicial?
Antes de iniciar con los carruseles, primero debes asegurarte de que el contenido previo esté bien definido. Por ejemplo, podrías comenzar añadiendo un título, como "Categorías sugeridas para ti", usando la siguiente propiedad:
Text("CATEGORÍAS SUGERIDAS PARA TI").font(.title3).foregroundColor(.white).bold()
El uso de modificadores como .font, .foregroundColor y .bold ayuda a que el texto se alinee visual y estéticamente con el diseño deseado.
¿Cómo implementar un scroll view horizontal?
Para los carruseles, utilizamos un scroll view horizontal, lo que permite desplazarse de lado a lado. Así es como se implementa:
ScrollView(.horizontal, showsIndicators:false){HStack{// Aquí irán los botones con imágenes}}
Este código crea un desplazamiento horizontal sin mostrar los indicadores, proporcionando un aspecto más limpio y centrado.
¿Cómo integrar imágenes dentro del carrusel?
Las imágenes son esenciales para un carrusel. Puedes mostrarlas como botones, lo cual es útil para que los usuarios puedan interactuar con ellas:
Button(action:{print("Categoría seleccionada")}){ZStack{RoundedRectangle(cornerRadius:8).fill(Color.blueGray).frame(width:160, height:90)Image("FPS")// Nombre de la imagen.resizable().scaledToFit().frame(width:42, height:42)}}
El uso del ZStack permite superponer una imagen sobre una figura geométrica, dando un fondo consistente y atractivo al botón.
¿Cómo añadir múltiples elementos en el carrusel?
Dado que las configuraciones de cada botón son similares, la reutilización del código facilita la adición de nuevos elementos. Simplemente copia y ajusta el siguiente código para cada categoría:
let categories =["FPS","RPG","OpenWorld"]ForEach(categories, id:\.self){ category inButton(action:{print("Categoria: \(category)")}){// Contenido del botón}}
La solución más eficiente y elegante es usar un ForEach, iterando un Array de categorías y generando un botón para cada una.
¿Qué necesitas para el siguiente módulo de carrusel?
Para otro módulo como "Recomendados para ti", el procedimiento es similar. Cambia los títulos y usa imágenes de videojuegos:
Text("RECOMENDADOS PARA TI").font(.title3).foregroundColor(.white).bold()ScrollView(.horizontal, showsIndicators:false){HStack{// Añadir botones de videojuego del mismo modo que categorías}}
Conclusión
Con estas instrucciones, podrás crear carruseles dinámicos y estéticamente atractivos en tu aplicación. Los retos siguientes son terminar de pulir estos módulos y aplicar estos conocimientos a otros similares que necesites implementar más adelante.
Recuerda siempre animarte a seguir aprendiendo y cada paso que des en la programación te llevará a dominar esta práctica. ¡Sigue practicando y tu habilidad en programación se fortalecerá!
soy al unico que al bajar con el scroll el contenido, al momento de tocar abajo justo donde esta la barra del navigation, se cambia el color a por defecto?
Puedes utilizar el modificador .toolbarBackground(.hidden, for: .tabBar) en cada tabItem para evitar ese bug
Para los que vean esto en Xcode 16.0+
Los NavigationLink quedarían de la siguiente manera:
Primera parte del reproductor.
Text("Videos que podrían gustarte").font(.title3).foregroundColor(.white).bold().frame(maxWidth:.infinity,alignment:.leading)ScrollView(.horizontal,showsIndicators:false){HStack{Button(action:{ url = urlVideos[4]print("URL:", url) isPlayerActive =true}){Image("Grand Theft Auto V").resizable().scaledToFit().frame(width:240,height:135)}Button(action:{ url = urlVideos[5]print("URL:", url) isPlayerActive =true}){Image("Hades").resizable().scaledToFit().frame(width:240,height:135)}}}.padding(.bottom)
El código en structs para no repetir
struct TitleView:View{vartitle:Stringvarbody: some View{Text(title).font(.title3).foregroundColor(.white).bold().frame(minWidth:0,maxWidth:.infinity,alignment:.leading)}}struct CategoryCarrouselItem:View{var image,text:Stringvaraction:()->Voidvarbody: some View{Button(action: action,label:{ZStack{RoundedRectangle(cornerRadius:8).fill(Color("BlueGray")).frame(width:160,height:90)VStack{Image(image)Image(text)}}})}}
Cómo hago para que al retroceder el video automáticamente deje de seguir reproduciéndose?
Hola :D
¿Qué problema tienes? ¿En qué podemos ayudarte?
Xavier, precisamente ése es problema, cuando reproduces un vídeo y le das atasco, sigue sonando el vídeo aunque ya no lo veas
Cuando preciono "Back" se sigue reproducioendo el video. Como se puede evitar eso?
Si estas viendo esto después de iOS 16 lo mas probable es que te enfrentes con el problema de que al bajar el scroll tu TabView se ponga de color blanco. Y bueno después de andar investigando y probando diferentes soluciones encontré 2 que posiblemente te puedan servir.
Esconder el background del toolbar
Si seguiste el video del profesor e utilizaste el inicializador de las librerías antiguas (UIKit) la forma en la que resolví es agregar a cada tabItem la propiedad toolbarBackground(.hidden, for: .tabBar) te muestro el ejemplo:
De esta forma no es necesario inicializar con UIKit.
¿Y la explicación?
En mi camino para convertirme en desarrollador nunca me ha gustado solamente copiar y pegar código sin entender el "por qué" entonces basado en mi experiencia intentare explicar que es lo que sucede en cada caso:
Solución 1:
En lo poco que llevo como desarrollador iOS, he notado que el toolbar parece no tener un color de fondo por defecto entonces al momento de que swift detecta que hay elementos "por detrás" este asigna un fondo blanco y transparente, lo que estaría sustituyendo nuestra configuración inicial
Al nosotros poner ese background como hidden evitamos que se muestre el fondo configurado por swiftui (ya que entiendo que podría arruinar la UX)
Solución 2:
Esta solución la encontré en un foro de StackOverflow así que te dejo un fragmento de la explicación:
El primer modificador establece el color del fondo. El segundo hace que el fondo sea visible en todo momento, independientemente del contenido de desplazamiento subyacente. Estos modificadores también se pueden utilizar de forma individual.