我在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];
}
动画仍然不完美,但至少它仍然会低于表格视图。请为此问题打开bug report with 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