UIRefreshControl endRefreshing不平滑

当我的数据完成加载和我的tableView已被重新加载,我调用我的刷新控制endRefreshing,然后从它的加载状态“跳跃”,并消失 – 我怎样才能实现一个平滑的animation,刷新控制时,幻灯片?

我添加了一个新的答案,因为唯一的解释不是很精确。 这可能是太多的意见。

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

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

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

其实你可以减less延迟到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,但是我认为,解决schemeII对于发生什么事情是最具描述性的。 另外,GCD不是很Objective-C-ISH,所以我个人更愿意坚持我的解决scheme。

解决了这个问题 – 重新加载数据后,我添加了一个小小的延迟endRefresh:

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

Swift 4解决scheme

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

其他解决scheme(延迟,使用CATransaction,…)更复杂,并没有给出任何明显的优势

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

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

这是不好的,因为在endRefreshanimation运行的时候,表更新自己。 所以正确的代码看起来像这样:

 [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]; } }]; 

尝试将调用封装到UIViewanimation块中的endRefreshing()

我也遇到了这个问题。 对于endRefreshing()文档指出:

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

该文件指出:

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