UIRefreshControl在UITableViewController中位置错误

我在UIRefreshControl上看到了很多问题,而且我的UITableViewController也遇到了问题。 问题发生得如此随机,从此我无法弄清楚为什么或如何发生。

问题是,有时当你向下滚动tableView时,UIRefreshControl出现在错误的位置,看起来像在tableView本身之上/之上。 我附上了问题的截图,我的代码也用于添加UIRefreshControl和它的刷新方法。

我感谢任何提供的帮助!

在此处输入图像描述

- (void)viewDidLoad { self.refreshControl = [[UIRefreshControl alloc] init]; [self.refreshControl addTarget:self action:@selector(refreshing:) forControlEvents:UIControlEventValueChanged]; [self.tableView addSubview:self.refreshControl]; self.tableView.tableFooterView = [[UIView alloc] init]; } - (void)refreshing:(UIRefreshControl*)refreshControl { [refreshControl beginRefreshing]; [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; [refreshControl endRefreshing]; [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; } 

这是iOS7的已知错误; 有时刷新控件被错误地放在视图层次结构的前面而不是后面。 您可以通过在布局后将其发送回来解决部分问题:

 - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; [self.refreshControl.superview sendSubviewToBack:self.refreshControl]; } 

动画仍然不完美,但至少它仍然低于表格视图。 请针对此问题与Apple打开错误报告 。

另外,如另一个答案所述,您不应自己将刷新控件添加到视图层次结构中。 表视图控制器将为您执行此操作。 但这不是问题所在。

Swift版本

 override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() refreshControl?.superview?.sendSubview(toBack: refreshControl!) } 

我有同样的问题并修复它:

 override func viewDidLoad() { let refreshControl = UIRefreshControl() refreshControl.addTarget(self, action: "refresh:", forControlEvents: .ValueChanged) tableView.backgroundView = refreshControl // <- THIS!!! } 

而不是添加子视图将refreshControl指定为backgroundView