如何在tableView加载时显示活动指标?
当我切换我的标签之间加载了几秒钟,我想知道我的数据正在加载。 为此,我决定添加一个活动指标。
我写了一个小函数:
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点击button时使用它:
@IBAction func goToMainFromInfo(sender: AnyObject) { self.showActivityIndicator() self.performSegueWithIdentifier("fromMainToInfoWActivity", sender: nil) self.hideActivityIndicator() } }
我在继续执行和隐藏之后显示它。 它不能帮助我。 当我尝试使用同步:
@IBAction func goToMainFromInfo(sender: AnyObject) { dispatch_async(dispatch_get_main_queue()) { self.showActivityIndicator() self.performSegueWithIdentifier("fromMainToInfoWActivity", sender: nil) self.hideActivityIndicator() } }
但是它也没有帮助。 当我按Tab键时,不透明度变成0.5,我等待加载。 但是我没有看到我的活动指标。
问题是什么?
试试这个:
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) }
而你想开始animation的地方
indicator.startAnimating() indicator.backgroundColor = UIColor.whiteColor()
停止:
indicator.stopAnimating() indicator.hidesWhenStopped = true
注意:避免同时启动和停止的呼叫。 只是给一些条件。
Swift 3.0
// 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) } } }
// 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 } }
开始animation
tableView.activityIndicatorView.startAnimating()
停止animation
tableView.activityIndicatorView.stopAnimating()
你可以在Magic中find更多的代码
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() } ... }
这段代码可以帮助你:)
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()
迅速
把它放在你的课堂下面:
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()
在我的情况下,我通过一个func请求来请求json对象,所以我把它放在该函数的末尾,以便在数据加载后删除活动指示器:
self.indicator.stopAnimating() self.indicator.hidesWhenStopped = true
另一种方法,在我的代码中,我添加了一个扩展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() } } } }
注意:我的tableview被embedded到一个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 }
使用“lazy var”。 这比function更好
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() }