UIRefreshControl endRefreshing不流畅

时间:2015-02-17 10:41:44

标签: ios user-interface animation tableview

当我的数据加载完毕并且我的tableView已经重新加载时,我在刷新控件上调用endRefreshing,然后从其加载状态“跳转”并消失 - 我怎样才能实现一个平滑的动画来滑动刷新控件它完整​​了?

6 个答案:

答案 0 :(得分:24)

解决了问题 - 重新加载数据后,我在endRefresh中添加了一个小延迟:

[self.tableView reloadData];
[self.refreshControl performSelector:@selector(endRefreshing) withObject:nil afterDelay:0.05];

答案 1 :(得分:24)

我正在添加一个新答案,因为唯一一个解释不是很精确。这可能对评论来说太过分了。

Halpo的解决方案是正确的。但提到的原因是错误的。

调用-[NSObject (NSDelayedPerforming) performSelector:withObject:afterDelay:]可以保证在下一次runloop迭代中执行调用。

所以这不起作用,因为有一个小的延迟,但你将它移动到下一个循环。

实际上,您可以将延迟减少到0.0,它仍然有效。此外,更正确(在使用对象意味着实现某些目标,而不是更好的结果)实现是可能的。

以下是各种代码段:

// SOLUTION I

[[self tableView] reloadData];
[[self refreshControl] performSelector:@selector(endRefreshing) withObject:nil afterDelay:0.0];

// SOLUTION II (semantically correct)

[[self tableView] reloadData];
[[NSOperationQueue currentQueue] addOperationWithBlock:^{
    [[self refreshControl] endRefreshing];
}];

// SOLUTION III (GCD)

dispatch_async(dispatch_get_main_queue(), ^{
    [[self refreshControl] endRefreshing];
}];

修改

正如johann-fradj指出的那样,你也可以使用GCD。我非常喜欢GCD,但我认为,解决方案II最具描述性。此外,GCD不是很客观C-ish,所以我个人宁愿坚持我的解决方案。

答案 2 :(得分:3)

Swift 4解决方案

    tableView.reloadData()
    if refreshControl?.isRefreshing == true {
        DispatchQueue.main.async {
            self.refreshControl?.endRefreshing()
        }
    }

其他解决方案(延迟,使用CATransaction,......)更复杂,并且没有任何明显优势

答案 3 :(得分:1)

尝试将调用包装到UIView动画块中的endRefreshing()

我也遇到过这个问题。对于endRefreshing()文档说明:

UIView.animateWithDuration(0.5) {
    self.refreshControl.endRefreshing()
}

文档说明:

  

如果还启用了动画,则使用动画隐藏控件。

答案 4 :(得分:0)

其中一个原因可能是在调用endRefresh后刷新表视图。例如,我的调用过去看起来像这样:

[self.refreshControl beginRefreshing];
[self.network getThings:^(id things, NSError *error) {
    [self.refreshControl endRefreshing];

    if (error) {
        ...
    } else {
        self.things = things;
        [self.tableView reloadData];
    }
}];

哪个不好,因为在endRefresh动画运行时表会自行更新。所以正确的代码看起来像这样:

[self.refreshControl beginRefreshing];
[self.network getThings:^(id things, NSError *error) {
    if (error) {
        [self.refreshControl endRefreshing];
        ...
    } else {
        self.things = things;
        [self.tableView reloadData];
        [self.refreshControl endRefreshing];
    }
}];

答案 5 :(得分:0)

对我来说,解决方案是在调用refreshControl?.endRefreshing()之前运行tableView.reloadData()

refreshControl?.endRefreshing()
tableView.reloadData()

当对endRefreshing()的调用之后对reloadData()的调用时,只要重新加载数据,TableView就会跳转。