UIRefreshControl跳转和闪退问题

UIRefreshControl jump and flash issues

我有一个 UITableViewController 和 built-in UIRefreshControl。我想修复刷新动画的两个问题。

  1. 当我拖拉 table 视图时,它开始从我们的服务器更新数据。如果用户一直拖动它,就会发生明显的偏移跳跃。

  2. 当刷新操作结束时,table 视图隐藏动画的刷新控件。隐藏完成后,控件会闪烁几帧。

控件是从 UIStoryboard 设置的。我从那里设置目标和色调颜色。当动作触发时,我的代码刷新来自我们服务器的数据,当服务器响应时它有一个回调。我从那里停止刷新控制:

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

是我做错了什么还是 UIRefreshControl 只是 iOS 11 中的错误?

我遇到了类似的问题,这就是我最终解决它的方法:

  1. 需要设置'estimated row height'属性。否则,reloadData() 会导致明显的跳跃。这是解释

  2. 在用户仍在拖动时调用 endRefreshing() 也会导致明显的跳跃。为避免这种情况:

    • 当我从服务器接收到新数据时,我会检查用户是否仍在拖动 (UIScrollView.isDragging)。如果是这种情况,那么我不会立即调用 endRefreshing(),而是设置一个标志。
    • 我覆盖 scrollViewDidEndDragging 并检查那里的标志;如果设置,那么我调用 endRefreshing() 并清除标志。

UIRefreshControl此时有点神秘(它受很多因素影响-你使用大标题吗,在viewDidLoad中设置refreshControl或其他地方等)

摆脱这些问题的最佳方法是停止观察 UIRefreshControlvalueChanged 并在确定存在后执行 reloadData / endRefreshing没有拖动(例如 scrollViewDidEndDragging)。

我还能够通过这种方式从您的 gif 中重现 activity 闪烁 UIRefreshControl 指示器(并且仅适用于 iPhone X-like 没有导航栏半透明的设备):

edgesForExtendedLayout = [.top]
extendedLayoutIncludesOpaqueBars = true

然后我所要做的就是更改 edgesForExtendedLayoutextendedLayoutIncludesOpaqueBars