How to display an activity indicator with text on iOS 8 with Swift?

前端 未结 14 2190
没有蜡笔的小新
没有蜡笔的小新 2020-11-27 08:58

I wanna show, programmatically, an activity indicator with text, like the one in the Photos app (after editing and saving a picture). How can I do this?

14条回答
  •  孤独总比滥情好
    2020-11-27 09:38

    For activity indicator, its better you create one custom class.

    Instead of creating UIActivityIndicator in each UIViewController.Subclass UIView and use from any UIViewController.

    Updated for Swift 5.0:

    import UIKit
    import Foundation
    class ProgressIndicator: UIView {
    
    var indicatorColor:UIColor
    var loadingViewColor:UIColor
    var loadingMessage:String
    var messageFrame = UIView()
    var activityIndicator = UIActivityIndicatorView()
    
    init(inview:UIView,loadingViewColor:UIColor,indicatorColor:UIColor,msg:String){
    
        self.indicatorColor = indicatorColor
        self.loadingViewColor = loadingViewColor
        self.loadingMessage = msg
        super.init(frame: CGRect(x: inview.frame.midX - 90, y: inview.frame.midY - 250 , width: 180, height: 50))
        initalizeCustomIndicator()
    
    }
    convenience init(inview:UIView) {
    
        self.init(inview: inview,loadingViewColor: UIColor.brown,indicatorColor:UIColor.black, msg: "Loading..")
    }
    convenience init(inview:UIView,messsage:String) {
    
        self.init(inview: inview,loadingViewColor: UIColor.brown,indicatorColor:UIColor.black, msg: messsage)
    }
    
    required init?(coder aDecoder: NSCoder) {
    
        fatalError("init(coder:) has not been implemented")
    }
    
    func initalizeCustomIndicator(){
    
        messageFrame.frame = self.bounds
        activityIndicator = UIActivityIndicatorView(style: UIActivityIndicatorView.Style.medium)
        activityIndicator.tintColor = indicatorColor
        activityIndicator.hidesWhenStopped = true
        activityIndicator.frame = CGRect(x: self.bounds.origin.x + 6, y: 0, width: 20, height: 50)
        print(activityIndicator.frame)
        let strLabel = UILabel(frame:CGRect(x: self.bounds.origin.x + 30, y: 0, width: self.bounds.width - (self.bounds.origin.x + 30) , height: 50))
        strLabel.text = loadingMessage
        strLabel.adjustsFontSizeToFitWidth = true
        strLabel.textColor = UIColor.white
        messageFrame.layer.cornerRadius = 15
        messageFrame.backgroundColor = loadingViewColor
        messageFrame.alpha = 0.8
        messageFrame.addSubview(activityIndicator)
        messageFrame.addSubview(strLabel)
    
    
    }
    
    func  start(){
        //check if view is already there or not..if again started
        if !self.subviews.contains(messageFrame){
    
            activityIndicator.startAnimating()
            self.addSubview(messageFrame)
    
        }
    }
    
    func stop(){
    
        if self.subviews.contains(messageFrame){
    
            activityIndicator.stopAnimating()
            messageFrame.removeFromSuperview()
    
        }
    }
    }
    

    Put this class in your project and then call from any ViewController as

    var indicator:ProgressIndicator?
    override func viewDidLoad() {
        super.viewDidLoad()
    
        //indicator = ProgressIndicator(inview: self.view,messsage: "Hello from Nepal..")
        //self.view.addSubview(indicator!)
        //OR
        indicator = ProgressIndicator(inview:self.view,loadingViewColor: UIColor.grayColor(), indicatorColor: UIColor.blackColor(), msg: "Landing within minutes,Please hold tight..")
        self.view.addSubview(indicator!)
    
    }
    
    @IBAction func startBtn(sender: AnyObject) {
        indicator!.start()
    }
    
    
    @IBAction func stopBtn(sender: AnyObject) {
        indicator!.stop()
    }
    

提交回复
热议问题