Display activity indicator inside UIButton

后端 未结 10 1814
囚心锁ツ
囚心锁ツ 2021-01-31 17:36

I would like to change the content of a UIButton to an ActivityIndicator after it is pressed.

I know buttons have an imageView and a titleLabel, but I don\'t know how to

10条回答
  •  刺人心
    刺人心 (楼主)
    2021-01-31 17:55

    Swift 4.0 with a little modification

    class LoadingUIButton: UIButton {
    
        @IBInspectable var indicatorColor : UIColor = .lightGray
    
        var originalButtonText: String?
        var activityIndicator: UIActivityIndicatorView!
    
        func showLoading() {
            originalButtonText = self.titleLabel?.text
            self.setTitle("", for: .normal)
    
            if (activityIndicator == nil) {
                activityIndicator = createActivityIndicator()
            }
    
            showSpinning()
        }
    
        func hideLoading() {
            DispatchQueue.main.async(execute: {
                self.setTitle(self.originalButtonText, for: .normal)
                self.activityIndicator.stopAnimating()
            })
        }
    
        private func createActivityIndicator() -> UIActivityIndicatorView {
            let activityIndicator = UIActivityIndicatorView()
            activityIndicator.hidesWhenStopped = true
            activityIndicator.color = indicatorColor
            return activityIndicator
        }
    
        private func showSpinning() {
            activityIndicator.translatesAutoresizingMaskIntoConstraints = false
            self.addSubview(activityIndicator)
            centerActivityIndicatorInButton()
            activityIndicator.startAnimating()
        }
    
        private func centerActivityIndicatorInButton() {
            let xCenterConstraint = NSLayoutConstraint(item: self, attribute: .centerX, relatedBy: .equal, toItem: activityIndicator, attribute: .centerX, multiplier: 1, constant: 0)
            self.addConstraint(xCenterConstraint)
    
            let yCenterConstraint = NSLayoutConstraint(item: self, attribute: .centerY, relatedBy: .equal, toItem: activityIndicator, attribute: .centerY, multiplier: 1, constant: 0)
            self.addConstraint(yCenterConstraint)
        }
    
    }
    

提交回复
热议问题