2015-04-28 11 views
20

Quando si passa da una scheda all'altra, vengono caricati alcuni secondi e voglio sapere che i miei dati vengono caricati. Per questo ho deciso di aggiungere un indicatore di attività.Come mostrare l'indicatore di attività mentre carica tabellaView?

ho scritto una piccola funzione:

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() 
    } 
} 

che mostrerà il mio indicatore. E cercare di usarlo quando ho sfruttato dal mio InfoController pulsante:

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

mostro prima segue eseguire e nascondere dopo. Non mi aiuta Quando ho provato a utilizzare la sincronizzazione:

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

Ma non aiuta anche. Quando premo su una scheda, l'opacità diventa 0.5 e aspetto che si carichi. Ma non vedo il mio indicatore di attività.

Qual è il problema?

risposta

41

Basta provare questo:

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)  
} 

E dove si desidera iniziare l'animazione

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

Per fermata:

indicator.stopAnimating() 
indicator.hidesWhenStopped = true 

Nota: Evitare la chiamata di inizio e fine nello stesso tempo. Basta dare alcune condizioni.

+0

E' visibile. Semplicemente non sembra per niente –

+0

Perché offri l'indicatore di visibilità e nascondi nello stesso tempo – Lydia

+0

Ho commentato questa riga '//self.hideActivityIndicator()'. Resta lo stesso. Non funziona –

2

Questo codice può aiutare :)

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() 
2

SWIFT

posto questo qui di seguito la classe:

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

Posto questo nella vostra 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() 
.210

Nel mio caso, mi sto chiedendo oggetti JSON attraverso una richiesta func, così ho messo questo alla fine di quella funzione per rimuovere l'indicatore di attività una volta che il caricamento dei dati:

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

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() 

     } 
     ... 
    } 
+0

Per me il problema era che l'ho aggiunto alla vista, che era nascosta dalle mie celle tableview, con lo stesso colore di sfondo del colore di sfondo del tableview. Questa soluzione funziona fintanto che nessuna cella copre la vista (quindi durante il caricamento non è un problema), eccetto se hai (come ho fatto) una cella segnaposto che mostra del testo. In tal caso potrebbe essere più semplice aggiungere l'indicatore di caricamento a quella cella. –

12

Swift 3.0

// UIView estensione

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) 
     } 
    } 
} 

// NSObject estensione

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 
    } 
} 

animazione inizio

tableView.activityIndicatorView.startAnimating()

arresto animazione

tableView.activityIndicatorView.stopAnimating()

È possibile trovare maggiori codice Magic

+0

Impossibile farlo funzionare in quanto è il proprio file di estensione in Swift 4. –

0

Un altro approccio, Nel mio codice ho aggiunto un'estensione per 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() 
      } 
     } 
    } 
} 

Nota: La mia tableview è incorporata in una UIView (superview)

1
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 
} 
0

Utilizzo di "lazy var". E 'meglio che la funzione

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 
}() 

Basta avviare il filatore ovunque

come questo

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