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

前端 未结 14 2203
没有蜡笔的小新
没有蜡笔的小新 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:54

    With auto width and theme support also detects rotate while busy (Swift 3 version)

    Use it like below:

    var progressView: ProgressView?
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        self.progressView = ProgressView(message: "Work in progress!",
                                             theme: .dark,
                                             isModal: true)
    }
    
    @IBAction func onPause(_ sender: AnyObject) {
        self.progressView.show()      
    }
    
    @IBAction func onResume(_ sender: AnyObject) {
        self.progressView.hide()       
    }
    

    ProgressView.swift

    import UIKit
    
    class ProgressView: UIView {
    
        enum Theme {
            case light
            case dark
        }
    
        var theme: Theme
        var container: UIStackView
        var activityIndicator: UIActivityIndicatorView
        var label: UILabel
        var glass: UIView
    
    
        private var message: String
        private var isModal: Bool
    
        init(message: String, theme: theme, isModal: Bool) {
            // Init
            self.message = message
            self.theme = theme
            self.isModal = isModal
    
            self.container = UIStackView()
            self.activityIndicator = UIActivityIndicatorView()
            self.label = UILabel()
            self.glass = UIView()
    
            // Get proper width by text message
            let fontName = self.label.font.fontName
            let fontSize = self.label.font.pointSize
            if let font = UIFont(name: fontName, size: fontSize) {
                let fontAttributes = [NSFontAttributeName: font]
                let size = (message as NSString).size(attributes: fontAttributes)
                super.init(frame: CGRect(x: 0, y: 0, width: size.width + 50, height: 50))
            } else {
                super.init(frame: CGRect(x: 0, y: 0, width: 200, height: 50))
            }
    
            // Detect rotation
            NotificationCenter.default.addObserver(self, selector: #selector(onRotate), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
    
            // Style
            self.layer.cornerRadius = 3
            if (self.theme == .dark) {
                self.backgroundColor = .darkGray
            } else {
                self.backgroundColor = .lightGray
            }
    
            // Label
            if self.theme == .dark {
                self.label.textColor = .white
            }else{
                self.label.textColor = .black
            }
            self.label.text = self.message
            // Container
            self.container.frame = self.frame
            self.container.spacing = 5
            self.container.layoutMargins = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)
            self.container.isLayoutMarginsRelativeArrangement = true
            // Activity indicator
            if (self.theme == .dark) {
                self.activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)
                self.activityIndicator.color = .white
            } else {
                self.activityIndicator = UIActivityIndicatorView(activityIndicatorStyle:.whiteLarge)
                self.activityIndicator.color = .black
            }
            self.activityIndicator.startAnimating()
            // Add them to container
    
            // First glass
            if let superview = UIApplication.shared.keyWindow {
                if (self.isModal) {
                    // glass
                    self.glass.frame = superview.frame;
                    if (self.theme == .dark) {
                        self.glass.backgroundColor = UIColor.black.withAlphaComponent(0.5)
                    } else {
                        self.glass.backgroundColor = UIColor.white.withAlphaComponent(0.5)
                    }
                    superview.addSubview(glass)
                }
            }
            // Then activity indicator and label
            container.addArrangedSubview(self.activityIndicator)
            container.addArrangedSubview(self.label)
            // Last attach it to container (StackView)
            self.addSubview(container)
            if let superview = UIApplication.shared.keyWindow {
                self.center = superview.center
                superview.addSubview(self)
            }
            //Do not show until show() is called
            self.hide()
        }
    
        required init(coder: NSCoder) {
            self.theme = .dark
            self.Message = "Not set!"
            self.isModal = true
            self.container = UIStackView()
            self.activityIndicator = UIActivityIndicatorView()
            self.label = UILabel()
            self.glass = UIView()
            super.init(coder: coder)!
        }
    
        func onRotate() {
            if let superview = self.superview {
                self.glass.frame = superview.frame
                self.center = superview.center
    //            superview.addSubview(self)
            }
        }
    
        public func show() {
            self.glass.isHidden = false
            self.isHidden = false
        }
    
        public func hide() {
            self.glass.isHidden = true
            self.isHidden = true
        }
    }
    

提交回复
热议问题