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