Mostrar imágenes de forma dinámica y eficiente con LazyVGrid
Resumen
¿Cómo mostrar imágenes dinámicas desde una URL en SwiftUI?
Imagina que estás desarrollando una aplicación donde necesitas mostrar imágenes provenientes de una URL, algo indispensable en el desarrollo de aplicaciones modernas hoy en día. Este proceso puede parecer desafiante si no estás familiarizado con el manejo de librerías externas en SwiftUI. Afortunadamente, gracias al poder de la comunidad de desarrolladores, puedes usar soluciones de terceros, como la librería Kingfisher, para simplificar esta tarea.
¿Qué necesitas para empezar?
Este procedimiento requiere algunos elementos básicos, como:
Xcode con soporte para SwiftUI.
Acceso a internet para obtener la librería desde un repositorio de GitHub.
Familiaridad básica con SwiftUI y cómo manejar dependencias de terceros.
¿Cómo importar la librería Kingfisher?
Para comenzar a usar la librería Kingfisher, sigue estos pasos:
Abre tu proyecto en Xcode y dirígete a File > Swift Packages > Add Package Dependency.
Ingresa la URL del repositorio de Kingfisher en GitHub cuando se te pida.
Selecciona la versión más reciente de la librería para asegurar que cuentas con las últimas funcionalidades y correcciones de errores.
Completa el proceso de instalación asegurándote de incluir Kingfisher en tu target.
Este proceso te permitirá usar Kingfisher en tu proyecto para descargar y mostrar imágenes de forma eficiente.
¿Cómo usar Kingfisher para mostrar imágenes desde una URL?
Una vez que la librería está instalada, sigamos adelante y usemos Kingfisher para mostrar imágenes.
Primero, necesitas importar la librería en tu archivo GamesView.swift:
importKingfisher
Luego, puedes configurar el elemento KFImage para renderizar imágenes desde una URL:
Una de las grandes ventajas de usar Kingfisher es su eficiencia en la gestión de la memoria. Cuando tenemos una gran cantidad de imágenes, Kingfisher utiliza técnicas como el uso de stacks perezosos (LazyVStack) para asegurar que solo las imágenes visibles se cargan en la memoria. Esto ayuda a mantener el uso de memoria bajo, aumentando así el rendimiento de la aplicación.
Puedes configurar el uso de LazyVStack como sigue:
LazyVStack{ForEach(0..<100){ index inKFImage(URL(string:"https://mi-servidor.com/mi-imagen-\(index).jpg")).resizable().aspectRatio(contentMode:.fit).clipShape(RoundedRectangle(cornerRadius:4)).padding(.bottom,12)}}
¿Cómo asegurarse de una buena experiencia de usuario?
Mostrar imágenes dinámicamente con confianza requiere algunas consideraciones adicionales:
Conéctate a un servidor confiable para garantizar que todas las URL de las imágenes sean válidas.
Usa placeholders para mejorar la experiencia del usuario mientras las imágenes se cargan.
Optimiza las imágenes en el servidor para acelerar el tiempo de carga y reducir el uso de datos.
Sumérgete en la potente comunidad y aprende a aprovechar al máximo librerías como Kingfisher. Con cada imagen cargada desde una URL, estarás expandiendo tu conjunto de habilidades en el desarrollo de aplicaciones con SwiftUI. ¡Sigue adelante y explora más en el mundo de SwiftUI!
Pero de igual forma, solo funciona en iOs 15 para arriba y de aquí a que todas las personas tengan iOs 15+ .
faltan un par de años.
Para esto use if #available(iOS 15.0, *) { donde cargo uno u otro según el SO, si tiene 15, uso la función que mencionan abajo para poder cambiar el tamaño y dejarlo bien
Esta es la URL del repo de la dependencia de Swift que hay que añadir:
https://github.com/onevcat/Kingfisher.git
(También la puedes encontrar en los recursos de la clase ;) )
Si usan AsynImage puede no funcionar resizable(). Entonces pueden usar lo siguiente.
Yo le deje el Text que el profe Juan había puesto para probar como se veía.
// Imagen y título de cada juego.VStack{AsyncImage( url:URL( string: juego.galleryImages[0])!){ image in image
.resizable().aspectRatio(contentMode:.fit).clipShape(RoundedRectangle(cornerRadius:15)).padding()} placeholder:{placeholderImage()}Text("\(juego.title)").foregroundColor(.white).font(.body).padding(.bottom,12.0)}
Pero es necesaria esta función, que cargara un View por si no puede tomar la imagen del servidor. Mientras carga pone el símbolo de cámara del SF symbols
// @ViewBuilder func placeholderImage()-> some View{Image(systemName:"photo").renderingMode(.template).resizable().aspectRatio(contentMode:.fit).frame(width:150,height:150).foregroundColor(.gray)}
Y queda así:
También te pasa lo del espacio arriba... no lo puedo solucionar
y gracias por el código
Alguien sabe como hacer un carousel de videos stream HSL tipo tik tok (preloading proximos videos)?? existe alguna librería o algo? En la empresa donde estoy tenemos problemos implementando esto.
No importa si es pagada la libreria...
Personalmente no conozco una librería así, pero cuando no puedo implementarlo por mi cuenta lo que hago es preguntar en stackoverflow y la mayoría de las veces encuentro solución : )
Hola, encontraste alguna libreria??
Creo que ha estas alturas del partido, todos o casi todos elegimos usar AsyncImage, so, dejo mi implementación que resuelve el problema del resizable.
sigo sin pode entender este error!!
Para alignear los items del Grid:
let formaGrid =[GridItem(.flexible(),alignment:.top),GridItem(.flexible(),alignment:.top)]
Otra opción también para insertar imagen para iOS 15+ en Xcode 13.4 es:
AsyncImage(url:URL(string: game.galleryImages[0]),content:{ image in image.resizable().aspectRatio(contentMode:.fit).frame(maxWidth:300,maxHeight:100)},placeholder:{ProgressView()})
Si no quieres usar la libreria, este codigo da el mismo resultado sin usos de librerias externas con el uso de AsyncImage()AsyncImage(url: URL(string: game.galleryImages[0])) { image in
image
.resizable()
.scaledToFit()
.cornerRadius(4)
.padding(.bottom, 12)
} placeholder: {
ProgressView()
}