Hal*_*lpo 20 user-interface animation tableview ios
当我的数据加载完毕并且我的tableView已经重新加载时,我在刷新控件上调用endRefreshing,然后从其加载状态"跳转"并消失 - 我怎么能实现一个平滑的动画,当它完成时滑动刷新控件?
Jul*_*ert 26
我正在添加一个新答案,因为唯一一个解释不是很精确.这可能对评论来说太过分了.
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];
}];
Run Code Online (Sandbox Code Playgroud)
编辑
正如johann-fradj指出的那样,你也可以使用GCD.我非常喜欢GCD,但我认为,解决方案II最具描述性.此外,GCD不是很客观C-ish,所以我个人宁愿坚持我的解决方案.
Hal*_*lpo 24
修复了问题 - 重新加载数据后,我在endRefresh中添加了一个小延迟:
[self.tableView reloadData];
[self.refreshControl performSelector:@selector(endRefreshing) withObject:nil afterDelay:0.05];
Run Code Online (Sandbox Code Playgroud)
斯威夫特 4 解决方案
tableView.reloadData()
if refreshControl?.isRefreshing == true {
DispatchQueue.main.async {
self.refreshControl?.endRefreshing()
}
}
Run Code Online (Sandbox Code Playgroud)
其他解决方案(延迟、使用 CATransaction 等)更复杂,并且没有任何明显的优势