jonasalbert
12/20/2017 - 9:26 AM

Loading Indicator


1.
let progress = ProgressHUD(text: "")

2.
    if let view = self.view.viewWithTag(2) {
      view.removeFromSuperview()
    }
    self.view.addSubview(progress)
    progress.show()



3.
class ProgressHUD: UIVisualEffectView {
  
  var text: String? {
    didSet {
      label.text = text
    }
  }
  
  let activityIndictor: UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray)
  let label: UILabel = UILabel()
  let blurEffect = UIBlurEffect(style: .light)
  let vibrancyView: UIVisualEffectView
  
  init(text: String) {
    self.text = text
    self.vibrancyView = UIVisualEffectView(effect: UIVibrancyEffect(blurEffect: blurEffect))
    super.init(effect: blurEffect)
    self.setup()
    self.tag = 2
  }
  
  required init?(coder aDecoder: NSCoder) {
    self.text = ""
    self.vibrancyView = UIVisualEffectView(effect: UIVibrancyEffect(blurEffect: blurEffect))
    super.init(coder: aDecoder)
    self.setup()
  }
  
  func setup() {
    contentView.addSubview(vibrancyView)
    contentView.addSubview(activityIndictor)
    contentView.addSubview(label)
    activityIndictor.startAnimating()
  }
  
  override func didMoveToSuperview() {
    super.didMoveToSuperview()
    
    if let superview = self.superview {
      
      let width: CGFloat = 100.0 //superview.frame.size.width / 2.3
      let height: CGFloat = 100.0
      self.frame = CGRect(x: superview.frame.size.width / 2 - width / 2,
                          y: superview.frame.height / 2 - height / 2,
                          width: width,
                          height: height)
      vibrancyView.frame = self.bounds
      
      let activityIndicatorSize: CGFloat = 90
      activityIndictor.frame = CGRect(x: 5,
                                      y: height / 2 - activityIndicatorSize / 2,
                                      width: activityIndicatorSize,
                                      height: activityIndicatorSize)
      
      layer.cornerRadius = 8.0
      layer.masksToBounds = true
      label.text = text
      label.textAlignment = NSTextAlignment.center
      label.frame = CGRect(x: activityIndicatorSize + 5,
                           y: 0,
                           width: width - activityIndicatorSize - 15,
                           height: height)
      label.textColor = UIColor.gray
      label.font = UIFont.boldSystemFont(ofSize: 16)
    }
  }
  
  func show() {
    self.isHidden = false
  }
  
  func hide() {
    self.isHidden = true
  }
}