Activity indicator with custom image

后端 未结 10 1267
甜味超标
甜味超标 2021-01-31 05:58

I am loading a UIWebView and in the meantime I wan\'t to show a blank page with this\"spinner\" activity indic

10条回答
  •  [愿得一人]
    2021-01-31 06:34

    I've faced a similar issue lately. And this is my solution. Basically, it's what topic starter initially wanted: blank page with custom activity indicator on it.
    I have partly used @Azharhussain Shaikh answer but I've implemented auto-layout instead of using frames and added a few other refinements with the intention to make usage as simple as possible.

    So, it's an extension for UIView with two methods: addActivityIndicator() and removeActivityIndicator()

    extension UIView {
    
    func addActivityIndicator() {
        //    creating a view (let's call it "loading" view) which will be added on top of the view you want to have activity indicator on (parent view)
        let view = UIView()
        //    setting up a background for a view so it would make content under it look like not active
        view.backgroundColor = UIColor.white.withAlphaComponent(0.7)
    
        //    adding "loading" view to a parent view
        //    setting up auto-layout anchors so it would cover whole parent view
        self.addSubview(view)
        view.translatesAutoresizingMaskIntoConstraints = false
        view.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
        view.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
        view.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true
        view.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true
    
        //    creating array with images, which will be animated
        //    in my case I have 30 images with names activity0.png ... activity29.png
        var imagesArray = [UIImage(named: "activity\(0)")!]
        for i in 1..<30 {
            imagesArray.append(UIImage(named: "activity\(i)")!)
        }
    
        //    creating UIImageView with array of images
        //    setting up animation duration and starting animation
        let activityImage = UIImageView()
        activityImage.animationImages = imagesArray
        activityImage.animationDuration = TimeInterval(0.7)
        activityImage.startAnimating()
    
        //    adding UIImageView on "loading" view
        //    setting up auto-layout anchors so it would be in center of "loading" view with 30x30 size
        view.addSubview(activityImage)
        activityImage.translatesAutoresizingMaskIntoConstraints = false
        activityImage.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        activityImage.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        activityImage.widthAnchor.constraint(equalToConstant: 30).isActive = true
        activityImage.heightAnchor.constraint(equalToConstant: 30).isActive = true
    }
    
    func removeActivityIndicator() {
        //    checking if a view has subviews on it
        guard let lastSubView = self.subviews.last else { return }
        //    removing last subview with an assumption that last view is a "loading" view
        lastSubView.removeFromSuperview()
    } }
    

    "Rotating" effect is achieved by those 30 images you've put in imagesArray. Each image is a new frame of a rotating indicator like this.

    Usage. In your view controller for showing an activity indicator simply put:

        view.addActivityIndicator()
    

    For removing an activity indicator:

        view.removeActivityIndicator()
    

    For example, in case of using it with table view (like I do) it can be used like this:

    func setLoadingScreen() {
        view.addActivityIndicator()
        tableView.isScrollEnabled = false
    }
    
    func removeLoadingScreen() {
        view.removeActivityIndicator()
        tableView.isScrollEnabled = true
    }
    

    It works in Swift 4.

提交回复
热议问题