IOS:UITableView上的ActivityIndi​​cator …如何?

我想显示一个活动指标,而不是在加载数据(在另一个线程)的一个可用的视图。 所以在UITableViewController的ViewDidLoad方法中:

-(void)viewDidLoad { [super viewDidLoad]; //I create the activity indicator UIActivityIndicatorView *ac = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; [ac startAnimating]; //Create the queue to download data from internet dispatch_queue_t downloadQueue = dispatch_queue_create("PhotoDownload",NULL); dispatch_async(downloadQueue, ^{ //Download photo ....... ....... dispatch_async(dispatch_get_main_queue(), ^{ ...... ...... [ac stopAnimating]; }); }); ....... 

为什么活动指标不显示在表格视图上? 我怎么能实现它?

你需要添加UIActivityIndi​​catorView的东西。 您可以将其添加到UITableView标题视图。 要做到这一点,你将需要提供自己的自定义视图。

 ... UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 50)]; [view addSubview:ac]; // <-- Your UIActivityIndicatorView self.tableView.tableHeaderView = view; ... 

我一直在试图find一个解决scheme,并阅读了很多论坛,但我没有得到我想要的。 了解了活动指标和表格视图控制器的工作原理之后,我想出了以下解决scheme。

出于某种原因,如果您尝试使用tableReload或任何其他昂贵的进程在同一线程上启动活动指示器,则活动指示器将不会运行。 如果您尝试在另一个线程中运行表重装或其他操作,则可能不安全,并可能产生错误或不需要的结果。 所以我们可以运行在另一个线程上显示活动指示符的方法。

我还将这个解决scheme与MBProgressHUD结合起来,呈现出一个看起来更美观的活动指标。 在任何情况下,activityView的外观都可以定制。

 -(void)showActivityViewer { AppDelegate *delegate = [[UIApplication sharedApplication] delegate]; UIWindow *window = delegate.window; activityView = [[UIView alloc] initWithFrame: CGRectMake(0, 0, window.bounds.size.width, window.bounds.size.height)]; activityView.backgroundColor = [UIColor blackColor]; activityView.alpha = 0.5; UIActivityIndicatorView *activityWheel = [[UIActivityIndicatorView alloc] initWithFrame: CGRectMake(window.bounds.size.width / 2 - 12, window.bounds.size.height / 2 - 12, 24, 24)]; activityWheel.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite; activityWheel.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin); [activityView addSubview:activityWheel]; [window addSubview: activityView]; [[[activityView subviews] objectAtIndex:0] startAnimating]; } -(void)hideActivityViewer { [[[activityView subviews] objectAtIndex:0] stopAnimating]; [activityView removeFromSuperview]; activityView = nil; } - (IBAction)reloadDataAction:(id)sender { [NSThread detachNewThreadSelector:@selector(showActivityViewer) toTarget:self withObject:nil]; //... do your reload or expensive operations [self hideActivityViewer]; } 

[iOS 5 +]
如果您只是想显示activityWheel而没有额外的父视图,则还可以将activityWheel直接添加到tableView,并使用tableViews contentOffset计算框架的y值:

 @interface MyTableViewController () @property (nonatomic, strong) UIActivityIndicatorView *activityView; @end // .... - (void) showActivityView { if (self.activityView==nil) { self.activityView = [[UIActivityIndicatorView alloc] initWithFrame:CGRectZero]; [self.tableView addSubview:self.activityView]; self.activityView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge; self.activityView.hidesWhenStopped = YES; // additional setup... // self.activityView.color = [UIColor redColor]; } // Center CGFloat x = UIScreen.mainScreen.applicationFrame.size.width/2; CGFloat y = UIScreen.mainScreen.applicationFrame.size.height/2; // Offset. If tableView has been scrolled CGFloat yOffset = self.tableView.contentOffset.y; self.activityView.frame = CGRectMake(x, y + yOffset, 0, 0); self.activityView.hidden = NO; [self.activityView startAnimating]; } - (void) hideActivityView { [self.activityView stopAnimating]; } 

如果activityView没有立即显示(或从不),请参阅zirinisp的回答或在后台执行繁重的工作。

有解决UIViewController。 (你可以使用UIViewController和表视图来实现一个UITableViewController。)在storyboard中,在UIViewController的视图中添加一个activityIndi​​cator。 然后在viewDidLoad中添加以下内容:

 [self.activityIndicator layer].zPosition = 1; 

activityIndi​​cator将显示在表视图上。

虽然这个问题比较老,但我也加了。 [IOS 8+]以上不适合我。 相反,我将指标视图(ac)存储在类中。 那我呢:

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { if (ac.isAnimating) return 50.0f; return 0.0f; } - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { if (ac.isAnimating) return ac; return nil; } 

为了显示指示灯我做的

 [ac startAnimating] 

为了隐藏它,我做到了

 [ac stopAnimating] 

我希望这对某个人有帮助。