Todas la aplicaciones en IOS en algún momento necesitan tiempo para realizar una operación, ya sea una petición request o descargar un archivo o guardar una gran cantidad de información, la cosa es que tenemos que dar una retroalimentación al usuario de que esta sucediendo algo y tenemos 2 opciones; o buscamos y bajamos una libreria para estas animaciones de ‘loading’ o creamos una nosotros mismo, y eso es lo que aremos aquí en este tutorial.
Este componente que estaremos creando sera una extension de la clase `View` de iOS y loq ue vamos a estar haciendo es llamar un metodo para que coloque a una vista en perticular el `LoadingSpiner` nativo de iOS y estaremos dandole el feedback al usuario de que algo esta cargando o siendo procesado y no podra seguir interactuando con dicha vista.
Este seria nuestro resultado final:
Para crear una simple animación loading para IOS, lo unico que necesitamos son 2 vistas, una vista que se mostrara como contenedor y otra que sera la de la animación.
extension UIView { func kHolderViewTag() -> Int { return self.hash } func kIndicatorViewTag() -> Int { return self.hash / 100; } func kProgressViewTag() -> Int { return self.hash / 1000 } func showLoadingIndicator() { if (self.superview?.viewWithTag(self.kHolderViewTag()) != nil) { let overlayView = UIView(frame: self.frame) overlayView.backgroundColor = UIColor.blue.withAlphaComponent(0.6) overlayView.tag = self.kHolderViewTag() overlayView.layer.cornerRadius = self.layer.cornerRadius let indicator = UIActivityIndicatorView(frame: self.frame) indicator.tag = self.kIndicatorViewTag() self.superview?.addSubview(overlayView) self.superview?.addSubview(indicator) indicator.startAnimating() } } func hideLoadingIndicator() { if (self.superview != nil) { if let overlayView = self.superview?.viewWithTag(self.kHolderViewTag()) { overlayView.removeFromSuperview() } if let indicator = self.superview?.viewWithTag(self.kIndicatorViewTag()) { overlayView.removeFromSuperview() } } } }
Funciona de esta manera, con cualquier instancia de UIView se podran llamar los metodos showLoadingIndicator y hideLoadingIndicator
La forma en como funciona es que toma a cualquier vista como referencia y crear una nueva vista que servira de fondo para el LoadingIndicator y le asigara una Tag el cual sera a partir del hash de cada vista, esto lo hago para cuando proceda a eliminar (Remover la animacion) tener una referencia mas clara de la vista que voy a eliminar y me da la opcion de poder tener varias animaciones corriendo al mismo tiempo.