UIRefreshControl endRefreshing不流畅

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)


col*_*ire 5

斯威夫特 4 解决方案

    tableView.reloadData()
    if refreshControl?.isRefreshing == true {
        DispatchQueue.main.async {
            self.refreshControl?.endRefreshing()
        }
    }
Run Code Online (Sandbox Code Playgroud)

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