Search code examples
iosswiftxcodecocoapods

How to isolate the loader screen code in swift?


I have created this custom code to create a loader in my project. The problem is that I have to copy and paste this function in all my classes. Is there any way I can declare this code in one global functions class and just use them wherever I want to use by calling.

import NVActivityIndicatorView


let activityIndicatorView = NVActivityIndicatorView(frame: CGRect(x: 80, y: 80, width: 60, height:60), type: .ballTrianglePath, color: .black)
    let blurView = UIView()

func startLoader(){

            DispatchQueue.main.async
                {
                        self.blurView.isHidden = false

                        self.blurView.frame = self.view.frame
                        self.blurView.backgroundColor = UIColor.gray.withAlphaComponent(0.5)

                        self.view.addSubview(self.blurView)
                        self.activityIndicatorView.center = self.blurView.center
                         self.view.addSubview(self.activityIndicatorView)

                        self.activityIndicatorView.startAnimating()
            }
        }

func stopLoader(){
        DispatchQueue.main.async {

            self.activityIndicatorView.stopAnimating()
            self.blurView.isHidden = true

        }

    }

Solution

  • First Create function to get activityIndicatorView and blurView. Because you don't need to repeat code in everywhere.And easily change entire loader views in one place

    Class Helper {
        static func getLoaderViews()->(UIView,NVActivityIndicatorView){
            let activityIndicatorView = NVActivityIndicatorView(frame: CGRect(x: 80, y: 80, width: 60, height:60), type: .ballTrianglePath, color: .black)
            let blurView = UIView()
            // create your components,customise and return
            return (blurView,activityIndicatorView)
        }
    }
    

    now create a UIViewController Extension to start or stop loader

    extension UIViewController {
    
        func addLoaderToView(view:UIView,blurView:UIView ,activityIndicatorView:NVActivityIndicatorView) {
    
                    blurView.isHidden = false
                    blurView.frame = view.frame
                    blurView.backgroundColor = UIColor.gray.withAlphaComponent(0.5)
    
                    view.addSubview(blurView)
                    activityIndicatorView.center = blurView.center
                    view.addSubview(activityIndicatorView)
                    activityIndicatorView.startAnimating()
        }
    
        func removeLoader(activityIndicatorView:NVActivityIndicatorView,blurView:UIView)  {
            activityIndicatorView.stopAnimating()
            blurView.isHidden = true
        }
    }
    

    Now you can easily add or remove loader in any UIViewController

        let (blurView,activityIndicatorView) = Helper.getLoaderViews() //In your class scope
    
    //where you want to start
        addLoaderToView(view:self.view,blurView:blurView ,activityIndicatorView:activityIndicatorView)
    //where you want to stop
        removeLoader(activityIndicatorView:activityIndicatorView,blurView:blurView)