Loading an “overlay” when running long tasks in iOS

前端 未结 11 904
没有蜡笔的小新
没有蜡笔的小新 2020-12-22 16:15

What is example for loading overlay in Swift IOS application when do a long tasks. Example for loading data from remote server. I googled but not found any answer.

U

相关标签:
11条回答
  • 2020-12-22 17:01

    For anyone late like me, I made some modifications to @Sonrobby code. As i understand, @Sonrobby adds the activity to the overlay on every showOverlay call. And some of the configuration can be passed to the init function, letting only the placement on the showOverlay method.

    I also change the overlay's background to black, since my app it is mostly white.

    here is the code :

    public class LoadingOverlay{
    
        var overlayView : UIView!
        var activityIndicator : UIActivityIndicatorView!
    
        class var shared: LoadingOverlay {
            struct Static {
                static let instance: LoadingOverlay = LoadingOverlay()
            }
            return Static.instance
        }
    
        init(){
            self.overlayView = UIView()
            self.activityIndicator = UIActivityIndicatorView()
    
            overlayView.frame = CGRectMake(0, 0, 80, 80)
            overlayView.backgroundColor = UIColor(white: 0, alpha: 0.7)
            overlayView.clipsToBounds = true
            overlayView.layer.cornerRadius = 10
            overlayView.layer.zPosition = 1
    
            activityIndicator.frame = CGRectMake(0, 0, 40, 40)
            activityIndicator.center = CGPointMake(overlayView.bounds.width / 2, overlayView.bounds.height / 2)
            activityIndicator.activityIndicatorViewStyle = .WhiteLarge
            overlayView.addSubview(activityIndicator)
        }
    
        public func showOverlay(view: UIView) {
            overlayView.center = view.center
            view.addSubview(overlayView)
            activityIndicator.startAnimating()
        }
    
        public func hideOverlayView() {
            activityIndicator.stopAnimating()
            overlayView.removeFromSuperview()
        }
    }
    
    0 讨论(0)
  • 2020-12-22 17:01

    Use ATKit.

    Refer: https://aurvan.github.io/atkit-ios-release/index.html

    ATProgressOverlay Class https://aurvan.github.io/atkit-ios-release/helpbook/Classes/ATProgressOverlay.html

    Code:

    import ATKit
    
    ATProgressOverlay.sharedInstance.show() // Does not show network activity indicator on status bar.
    
    ATProgressOverlay.sharedInstance.show(isNetworkActivity: true) // Shows network activity indicator on status bar.
    

    Screenshot:

    0 讨论(0)
  • 2020-12-22 17:02

    Swift 3.

    I used @Lucho's code in his answer below and I changed the overlay background color to clear and added a spinner color.

    public class LoadingOverlay {
    
        var overlayView : UIView!
        var activityIndicator : UIActivityIndicatorView!
    
        class var shared: LoadingOverlay {
            struct Static {
                static let instance: LoadingOverlay = LoadingOverlay()
            }
            return Static.instance
        }
    
        init(){
            self.overlayView = UIView()
            self.activityIndicator = UIActivityIndicatorView()
    
            overlayView.frame = CGRect(0, 0, 80, 80)
            overlayView.backgroundColor = .clear
            overlayView.clipsToBounds = true
            overlayView.layer.cornerRadius = 10
            overlayView.layer.zPosition = 1
    
            activityIndicator.frame = CGRect(0, 0, 40, 40)
            activityIndicator.center = CGPoint(overlayView.bounds.width / 2, overlayView.bounds.height / 2)
            activityIndicator.activityIndicatorViewStyle = .whiteLarge
            activityIndicator.color = .gray
            overlayView.addSubview(activityIndicator)
        }
    
        public func showOverlay(view: UIView) {
            overlayView.center = view.center
            view.addSubview(overlayView)
            activityIndicator.startAnimating()
        }
    
        public func hideOverlayView() {
            activityIndicator.stopAnimating()
            overlayView.removeFromSuperview()
        }
    }
    
    0 讨论(0)
  • 2020-12-22 17:03

    I've created a protocol for presenting your own view controller as an overlay. The usage is very simple:

    class ViewController: UIViewController, OverlayHost {
        @IBAction func showOverlayButtonPressed() {
            showOverlay(type: YourOverlayViewController.self, 
                fromStoryboardWithName: "Main")
        }
    }
    

    Result:

    Source code: https://github.com/agordeev/OverlayViewController

    Related article: https://andreygordeev.com/2017/04/18/overlay-view-controller-protocols-swift/

    0 讨论(0)
  • 2020-12-22 17:08

    The above answers add a loading view but it doesn't block click events on the screen also it does not provides overlay for rest of screen. You can achieve it as follows:

    let alert = UIAlertController(title: nil, message: "Please wait...", preferredStyle: .Alert)
    
    alert.view.tintColor = UIColor.blackColor()
    let loadingIndicator: UIActivityIndicatorView = UIActivityIndicatorView(frame: CGRectMake(10, 5, 50, 50)) as UIActivityIndicatorView
    loadingIndicator.hidesWhenStopped = true
    loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray
    loadingIndicator.startAnimating();
    
    alert.view.addSubview(loadingIndicator)
    presentViewController(alert, animated: true, completion: nil)
    

    Swift 3.0

    let alert = UIAlertController(title: nil, message: "Please wait...", preferredStyle: .alert)
    
    let loadingIndicator = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50))
    loadingIndicator.hidesWhenStopped = true
    loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray
    loadingIndicator.startAnimating();
    
    alert.view.addSubview(loadingIndicator)
    present(alert, animated: true, completion: nil)
    

    Swift 4.0 and newer

    let alert = UIAlertController(title: nil, message: "Please wait...", preferredStyle: .alert)
    
    let loadingIndicator = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50))
    loadingIndicator.hidesWhenStopped = true
    loadingIndicator.style = UIActivityIndicatorView.Style.gray
    loadingIndicator.startAnimating();
    
    alert.view.addSubview(loadingIndicator)
    present(alert, animated: true, completion: nil)
    

    and you can hide it as follows:

    dismiss(animated: false, completion: nil)
    

    It will be shown as follows:

    0 讨论(0)
提交回复
热议问题