2015-04-28 3 views
20

Когда я переключаюсь между моими вкладками, он загружает несколько секунд, и я хочу знать, что мои данные загружаются. Для этого я решил добавить индикатор активности.Как показать индикатор активности при загрузке таблицыView?

я написал небольшую функцию:

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

, который будет показывать мой индикатор. И пытаться использовать его, когда я постучала от моего infoController к кнопке:

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

Я показать его перед Segue выполнить и спрятаться после. Это мне не помогает. Когда я попытался использовать синхронизацию:

Но это тоже не помогает. Когда я нажимаю на вкладку, прозрачность становится 0,5, и я жду, пока она загружается. Но я не вижу индикатора активности.

В чем проблема?

ответ

41

Просто попробуйте это:

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

А где вы хотите начать анимировать

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

Для остановки:

indicator.stopAnimating() 
indicator.hidesWhenStopped = true 

Примечание: Избегайте призвания запуска и остановки в то же время. Просто дайте некоторые условия.

+0

Это видно. Просто не отображается вообще –

+0

Почему вы даете индикатор индикатора показа и спрятаны в то же время – Lydia

+0

Я прокомментировал эту строку '//self.hideActivityIndicator()'. Это все равно. Не работает –

2

Этот код может помочь вам :)

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

СВИФТ

Место это ниже своего класса:

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

Место это в 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() 

В моем случае, я прошу объекты JSon через запрос Func, поэтому я поместил это в конце этой функции, чтобы удалить индикатор активности раз нагрузок данных:

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

Для меня проблема заключалась в том, что я добавил его в представление, которое было скрыто моими ячейками tableview, с тем же цветом фона, что и цвет фона таблицы. Это решение работает до тех пор, пока никакие ячейки не закрывают представление (поэтому при загрузке это не проблема), за исключением случаев, когда у вас есть (как и я) ячейка-заполнитель, отображающая некоторый текст. В этом случае было бы проще добавить индикатор загрузки в эту ячейку. –

12

Swift 3.0

// UIView Extension

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 Extension

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

старт анимация

tableView.activityIndicatorView.startAnimating()

остановка анимации

tableView.activityIndicatorView.stopAnimating()

Вы можете найти больше кода в Magic

+0

Не удалось заставить его работать как собственный файл расширения в Swift 4. –

0

Другой подход, в моем коде я добавил расширение для 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() 
      } 
     } 
    } 
} 

Примечание: Мой табличный вид встроен в UIView (супервизор)

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

Использование "lazy var". Это лучше, чем функции

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

Просто запустите вертушку везде

как этот

func requestData() { 
    // Request something 
    activityIndicatorView.startAnimating() 
} 
Смежные вопросы