Comment afficher l'indicateur d'activité pendant le chargement de tableView?

Quand je passe d'un onglet à l'autre, il charge quelques secondes et je veux savoir que mes données sont en cours de chargement. Pour cela j'ai décidé d'append un indicateur d'activité.

J'ai écrit une petite fonction:

func showActivityIndicator() { dispatch_async(dispatch_get_main_queue()) { self.spinner = UIActivityIndicatorView(activityIndicatorStyle: .WhiteLarge) self.spinner.frame = CGRect(x: 0.0, y: 0.0, width: 80.0, height: 80.0) self.spinner.center = CGPoint(x:self.loadingView.bounds.size.width / 2, y:self.loadingView.bounds.size.height / 2) self.loadingView.addSubview(self.spinner) self.view.addSubview(self.loadingView) self.spinner.startAnimating() } } 

cela montrera mon indicateur. Et essayez de l'utiliser quand j'ai tapé de mon infoController sur le button:

 @IBAction func goToMainFromInfo(sender: AnyObject) { self.showActivityIndicator() self.performSegueWithIdentifier("fromMainToInfoWActivity", sender: nil) self.hideActivityIndicator() } } 

Je le montre avant de jouer et de me cacher après. Cela ne m'aide pas. Quand j'ai essayé d'utiliser la synchronisation:

 @IBAction func goToMainFromInfo(sender: AnyObject) { dispatch_async(dispatch_get_main_queue()) { self.showActivityIndicator() self.performSegueWithIdentifier("fromMainToInfoWActivity", sender: nil) self.hideActivityIndicator() } } 

Mais ça n'aide pas trop. Quand j'appuie sur pour tabuler l'opacité devient 0.5 et j'attends pendant le chargement. Mais je ne vois pas mon indicateur d'activité.

Quel est le problème?

Essayez ceci:

 var indicator = UIActivityIndicatorView() func activityIndicator() { indicator = UIActivityIndicatorView(frame: CGRectMake(0, 0, 40, 40)) indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray indicator.center = self.view.center self.view.addSubview(indicator) } 

Et où vous voulez commencer à animer

 indicator.startAnimating() indicator.backgroundColor = UIColor.whiteColor() 

Pour l'arrêt:

 indicator.stopAnimating() indicator.hidesWhenStopped = true 

Remarque: Évitez les appels de démarrage et d'arrêt en même time. Donne juste quelques conditions.

Swift 3.0

// Extension UIView

 fileprivate var ActivityIndicatorViewAssociativeKey = "ActivityIndicatorViewAssociativeKey" public extension UIView { var activityIndicatorView: UIActivityIndicatorView { get { if let activityIndicatorView = getAssociatedObject(&ActivityIndicatorViewAssociativeKey) as? UIActivityIndicatorView { return activityIndicatorView } else { let activityIndicatorView = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 40, height: 40)) activityIndicatorView.activityIndicatorViewStyle = .gray activityIndicatorView.color = .gray activityIndicatorView.center = center activityIndicatorView.hidesWhenStopped = true addSubview(activityIndicatorView) setAssociatedObject(activityIndicatorView, associativeKey: &ActivityIndicatorViewAssociativeKey, policy: .OBJC_ASSOCIATION_RETAIN_NONATOMIC) return activityIndicatorView } } set { addSubview(newValue) setAssociatedObject(newValue, associativeKey:&ActivityIndicatorViewAssociativeKey, policy: .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } } } 

// Extension NSObject

 public extension NSObject { func setAssociatedObject(_ value: AnyObject?, associativeKey: UnsafeRawPointer, policy: objc_AssociationPolicy) { if let valueAsAnyObject = value { objc_setAssociatedObject(self, associativeKey, valueAsAnyObject, policy) } } func getAssociatedObject(_ associativeKey: UnsafeRawPointer) -> Any? { guard let valueAsType = objc_getAssociatedObject(self, associativeKey) else { return nil } return valueAsType } } 

démarrer l'animation

tableView.activityIndicatorView.startAnimating()

arrêter l'animation

tableView.activityIndicatorView.stopAnimating()

Vous pouvez find plus de code dans Magic

Swift 2+

  class ViewController: UITableViewController { weak var activityIndicatorView: UIActivityIndicatorView! override func viewDidLoad() { super.viewDidLoad() let activityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray) tableView.backgroundView = activityIndicatorView self.activityIndicatorView = activityIndicatorView activityIndicatorView.startAnimating() } ... } 

Ce code peut vous aider 🙂

  let indicator:UIActivityIndicatorView = UIActivityIndicatorView (activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray) indicator.color = UIColor .magentaColor() indicator.frame = CGRectMake(0.0, 0.0, 10.0, 10.0) indicator.center = self.view.center self.view.addSubview(indicator) indicator.bringSubviewToFront(self.view) indicator.startAnimating() 

RAPIDE

Placez ceci ci-dessous votre class:

 let indicator:UIActivityIndicatorView = UIActivityIndicatorView (activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray) 

Placez ceci dans votre loadView ():

 indicator.color = UIColor .magentaColor() indicator.frame = CGRectMake(0.0, 0.0, 10.0, 10.0) indicator.center = self.view.center self.view.addSubview(indicator) indicator.bringSubviewToFront(self.view) indicator.startAnimating() 

Dans mon cas, je request des objects json via une requête func, donc je l'ai placé à la fin de cette fonction pour supprimer l'indicateur d'activité une fois datatables chargées:

 self.indicator.stopAnimating() self.indicator.hidesWhenStopped = true 

Une autre approche, Dans mon code, j'ai ajouté une extension pour UITableView (Swift 2.3):

 extension UITableView { func activityIndicator(center: CGPoint = CGPointZero, loadingInProgress: Bool) { let tag = 12093 if loadingInProgress { var indicator = UIActivityIndicatorView() indicator = UIActivityIndicatorView(frame: CGRectMake(0, 0, 40, 40)) indicator.tag = tag indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.WhiteLarge indicator.color = //Your color here indicator.center = center indicator.startAnimating() indicator.hidesWhenStopped = true self.superview?.addSubview(indicator) }else { if let indicator = self.superview?.viewWithTag(tag) as? UIActivityIndicatorView { { indicator.stopAnimating() indicator.removeFromSuperview() } } } } 

Note: Ma vue de table est embeddede dans un UIView (superview)

  func setupSpinner(){ spinner = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 40, height:40)) spinner.color = UIColor(Colors.Accent) self.spinner.center = CGPoint(x:UIScreen.main.bounds.size.width / 2, y:UIScreen.main.bounds.size.height / 2) self.view.addSubview(spinner) spinner.hidesWhenStopped = true } 

En utilisant "var paresseux". C'est mieux que la fonction

 fileprivate lazy var activityIndicatorView: UIActivityIndicatorView = { let activityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: .gray) activityIndicatorView.hidesWhenStopped = true // Set Center var center = self.view.center if let navigationBarFrame = self.navigationController?.navigationBar.frame { center.y -= (navigationBarFrame.origin.y + navigationBarFrame.size.height) } activityIndicatorView.center = center self.view.addSubview(activityIndicatorView) return activityIndicatorView }() 

Commencez simplement la roulette n'importe où

comme ça

 func requestData() { // Request something activityIndicatorView.startAnimating() }