UIRefreshControl跳跃和闪烁问题

6
我有一个内置的UIRefreshControlUITableViewController。我遇到了两个需要解决的刷新动画问题。
  1. 当我拖拉表视图时,它开始从我们的服务器更新数据。如果用户继续拖动,会出现明显的偏移跳跃。

  2. 当刷新操作结束后,表视图会隐藏刷新控件并进行动画处理。完成隐藏后,控件会闪烁几帧。

Showcase

该控件是从UIStoryboard中设置的。我在那里设置了目标和色调颜色。当操作触发时,我的代码会从我们的服务器刷新数据,并在服务器响应时进行回调。我会在那里停止刷新控件:

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

是我做错了什么还是UIRefreshControl在iOS 11中有问题?


在 dispatch_async 方法中重新加载 tableView - Chirag Kothiya
这会让情况变得更糟。如果我使用UIRefreshControl,它会完全跳过动画,并且会向表视图设置错误的偏移量。 - gklka
请尝试在您的控制器中添加 self.extendedLayoutIncludesOpaqueBars = YES,能否?UIRefreshControl 存在很多类似这样的问题... - AnthoPak
在处理 UIRefreshControl 和异步网络请求时,我从未遇到过这种行为。因此,我猜测你的代码中存在某些 bug。 - RyanB
当我把“-endRefreshing”调用移到“-reloadData”之后,闪烁问题就消失了。拖动时跳跃的原因似乎是由于重新加载引起的。还有什么其他方式可以重新加载吗? - gklka
2个回答

10

我曾遇到类似的问题,以下是我最终解决它的方法:

  1. 需要设置“预估行高”属性。否则,reloadData()会导致明显的跳动。这在这里有详细说明。

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

    • 当我从服务器接收到新数据时,我检查用户是否仍在拖动(UIScrollView.isDragging)。如果是,则不立即调用endRefreshing(),而是设置一个标志。
    • 我重写了scrollViewDidEndDragging并在其中检查标志;如果被设置,那么我调用endRefreshing()并清除标志。

4

UIRefreshControl 在某种程度上有些神秘 (它受很多因素的影响 - 例如您是否使用大标题,在viewDidLoad或其他地方设置refreshControl等)。

摆脱这些问题的最好方法是停止观察 UIRefreshControlvalueChanged,并在确保没有拖动时(例如scrollViewDidEndDragging)执行 reloadData / endRefreshing

此外,我能够通过以下方式重现您的gif中UIRefreshControl活动指示器闪烁(仅适用于类似iPhone X的设备且无导航栏半透明性):

edgesForExtendedLayout = [.top]
extendedLayoutIncludesOpaqueBars = true

然后我所需要做的就是更改 edgesForExtendedLayoutextendedLayoutIncludesOpaqueBars 这两个属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接