UIRefreshControl在UITableViewController中处于错误的位置

问题描述 投票:10回答:2

我在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;
 }
ios objective-c uitableview uirefreshcontrol
2个回答
26
投票

这是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!)
}

13
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.