LaunchScreen que presenta una imagen y utiliza un fondo negro en toda la aplicaci贸n, que es agradable para la vista de los usuarios. Esta pantalla precede a una animaci贸n Lottie de carga.
Dragon Ball App
馃Ω馃徏iOS Demo
Descripci贸n
El objetivo personal de este proyecto final planteado en el m贸dulo iOS Avanzado del Bootcamp de Desarrollo de Apps M贸viles fue aplicar todos los conocimientos adquiridos para desarrollar una aplicaci贸n completa, dedicando, por mi parte, tiempo extra a la investigaci贸n de nuevos componentes y funcionalidades, as铆 como prestar atenci贸n al dise帽o, l贸gica y organizaci贸n del c贸digo.
El c贸digo sigue el Clean Architecture de Robert C. Martin, dividi茅ndose en tres capas: Presentaci贸n, Datos y Dominio. La parte visual se inspira en los conceptos creativos de dise帽adores como Satyajit Mane y Shubham Rathod de la web Dribbble.
El dise帽o y el c贸digo sobresalen por caracter铆sticas como el uso de UICollectionView
con celdas interactivas y animadas, UITableViewCells
con sombras y gradientes, una pantalla de Favoritos con eliminaci贸n de celdas, animaciones con Lottie, integraci贸n de MapKit para mostrar ubicaciones personalizadas de personajes y detalles emergentes, y sombras animadas en UITextField
para mejorar la experiencia del usuario.
鈿狅笍 Informaci贸n mucho m谩s detallada en el README del proyecto en GitHub. 鈿狅笍
Caracter铆sticas y funcionalidades
- Patr贸n de dise帽o Model-View-ViewModel (MVVM).
- UIKit.
- Interfaz realizada program谩ticamente al 100%.
- Consumo de API Rest con llamadas as铆ncronas (
async/await
). - CoreData.
- MapKit.
- Keychain.
- UserDefaults.
- Unit Testing sobre CoreData y algunos otros m茅todos.
- Animaciones Lottie.
- Atenci贸n por el dise帽o y la experiencia de usuario.
Pantalla de Login en la que se le pide al usuario un correo electr贸nico y una contrase帽a, esenciales para realizar la llamada a la API Rest y conseguir el token del usuario, el cual dar谩 acceso a la aplicaci贸n.
Para mejorar la experiencia de usuario, se han a帽adido animaciones en los TextField
(a trav茅s de su Delegate en c贸digo) para indicar que se est谩 o no escribiendo sobre ellos y, respecto al control de errores, en caso de que el correo electr贸nico o la contrase帽a posean formatos inadecuados, aparece un aviso textual debajo de los TextField
, as铆 como un Alert
si las credenciales introducidas poseen el formato adecuado pero no se encuentran registradas en el Backend.
Pantalla principal de la aplicaci贸n que se encarga de mostrar una galer铆a de personajes inspirada en el prototipo del que se parte. Esta se ha conseguido con un CollectionView
, al que se le ha a帽adido un Header. Antes de cargar esta pantalla, se realiza la llamada a la API Rest para traer los datos a nuestra aplicaci贸n y, as铆, almacenarlos en CoreData para que la pr贸xima vez que se acceda no se tenga que llamar a la API y los datos se obtengan desde nuestra Base de Datos local.
En la ToolBar, podemos ver el que ser铆a el logo de nuestra aplicaci贸n a la izquierda y, a la derecha, un icono sin funcionalidad que nos dar铆a pie a implementar en un futuro la navegaci贸n a una pantalla que muestre la representaci贸n de los datos personales del usuario y otro icono de cierre de sesi贸n, el cual nos env铆a a la pantalla de Login, adem谩s de, en este caso, eliminar el token de Keychain y los datos extra铆dos de la API almacenados en CoreData.
Por otro lado, cabe se帽alar el nivel de personalizaci贸n que posee cada celda, siendo una Card con una imagen con un gradiente encima para que el texto sea legible y una sombra alrededor (esta se ha realizado con una View
tras la Card).
Las celdas de nuestro CollectionView
son din谩micas y poseen dos funcionalidades: una al pulsar y otra al dejar pulsado. En caso de la segunda opci贸n, conseguimos el efecto que observamos en la imagen (ContextMenu
) y que, en este caso, se han a帽adido dos textos con los que podemos a帽adir o eliminar de favoritos al personaje seleccionado. Esta acci贸n actualizar谩 un par谩metro booleano del modelo del personaje que indica si est谩 o no en favoritos, lo cual nos permitir谩 listar aquellos que s铆 lo son en otra pantalla.
Si pulsamos simplemente en una celda (se ha a帽adido una animaci贸n para indicar al usuario que se ha clickado), navegamos al detalle del personaje, donde se muestra su imagen y su descripci贸n, as铆 como un bot贸n personalizado que nos permitir谩 retornar.
La segunda vista de nuestro TabView
ser铆a esta, llamada B煤squedas, en la que se nos muestra de nuevo el listado de personajes pero con un estilo de Card diferente y empleando un UITableView
. Aqu铆 solo tenemos la opci贸n de pulsar la Card y navegar al detalle.
Sin embargo, tenemos la posibilidad de realizar b煤squedas empleando un UISearchController
que se incluye en el ViewController
. Dichas b煤squedas se realizan con el algoritmo de similitud de Jaccard (detallo m谩s acerca de 茅l, aqu铆).
Cada vez que la vista se encuentra en un estado de carga de datos y de espera para el usuario, se muestra una vista con una animaci贸n Lottie, la cual oscurece la vista principal que est谩 en carga. Adem谩s, es reutilizada tambi茅n en vistas como: antes del Login, cuando introducimos las credenciales del Login y estamos haciendo la llamada a la API Rest para corroborar los datos introducidos, etc.
En el caso de la imagen de ejemplo, se observa que se est谩 cargando el mapa que se tiene que mostrar con las localizaciones de los personajes.
La tercera vista del TabView
, llamada Explora, se corresponder铆a con un mapa donde se cargan las localizaciones de cada personaje. Todo esto utilizando la biblioteca MapKit.
Con la intenci贸n de tener un grado m谩s de personalizaci贸n, se han modificado los distintos pins para que muestren una imagen relacionada con la tem谩tica de nuestra aplicaci贸n.
Adem谩s de la imagen personalizada del pin, se ha a帽adido un men煤 que aparece cuando hacemos click en uno de estos pins, apareciendo el nombre del personaje de la localizaci贸n seleccionada y un bot贸n de informaci贸n, el cual, al ser pulsado, hace aparecer de forma modal una vista con el detalle del personaje.
La cuarta pantalla del TabView
ser铆a la de Favoritos, en la cual podemos acceder a todos aquellos personajes que hemos marcado como favoritos. Tambi茅n, desde aqu铆 podemos eliminar de la lista, tal y como vemos en la imagen.