Tom*_*Tom 18 uitableview uiactivityindicatorview ios
我希望在加载数据时(在另一个线程中)在uitableview上显示活动指示器.所以在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];
});
});
.......
Run Code Online (Sandbox Code Playgroud)
为什么活动指示器不会显示在表格视图上?我怎样才能实现它?
bba*_*art 21
您需要添加UIActivityIndicatorView.您可以将其添加到UITableView标头视图中.为此,您需要提供自己的自定义视图.
...
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
[view addSubview:ac]; // <-- Your UIActivityIndicatorView
self.tableView.tableHeaderView = view;
...
Run Code Online (Sandbox Code Playgroud)
zir*_*isp 12
我一直试图找到解决方案,并阅读了很多论坛,但我没有得到我想要的.在了解了活动指示器和表视图控制器如何工作之后,我提出了以下解决方案.
出于某种原因,如果您尝试使用tableReload或任何其他昂贵的进程在同一线程上启动活动指示器,则活动指示器永远不会运行.如果您尝试在另一个线程中运行表重新加载或其他操作,那么它可能不安全并可能产生错误或不需要的结果.所以我们可以运行在另一个线程上显示活动指示符的方法.
我还将此解决方案与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];
}
Run Code Online (Sandbox Code Playgroud)
小智 6
[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];
}
Run Code Online (Sandbox Code Playgroud)
如果activityView没有立即显示(或从不显示),请参阅zirinisp的答案或在后台执行繁重的工作.