UIRefreshControl跳转和闪存问题

问题描述 投票:5回答:2

我有一个内置UITableViewControllerUIRefreshControl。我有两个问题,我想修复刷新动画。

  1. 当我拖放表视图时,它开始从我们的服务器更新数据。如果用户继续拖动,则会发生明显的偏移跳跃。
  2. 刷新操作结束时,表视图会隐藏刷新控件的动画。完成隐藏后,控件会闪烁几帧。

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

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

我做错了什么或UIRefreshControl在iOS 11中只是错误?

objective-c uirefreshcontrol
2个回答
4
投票

我遇到了类似的问题,这就是我最终修复它的方式:

  1. 需要设置“估计行高”属性。否则,reloadData()引起明显的跳跃。这是here解释
  2. 在用户仍在拖动时调用endRefreshing()也会导致明显的跳转。为了避免这种情况 当我从服务器收到新数据时,我会检查用户是否仍在拖动(UIScrollView.isDragging)。如果是这种情况,那么我不会立即调用endRefreshing(),而是设置一个标志。 我重写scrollViewDidEndDragging并检查那里的旗帜;如果设置,那么我调用endRefreshing()并清除标志。

3
投票

UIRefreshControl在这一点上有点神秘(它受到许多事情的影响 - 你使用大型游戏,在refreshControl或其他地方设置viewDidLoad等)

摆脱这些问题的最好方法是停止观察valueChangedUIRefreshControl并在你确定没有拖拽之后做reloadData / endRefreshing(例如scrollViewDidEndDragging)。

此外,我能够通过这种方式从您的gif重现UIRefreshControl的活动指示器闪烁(仅适用于没有导航栏半透明的iPhone X类设备):

edgesForExtendedLayout = [.top]
extendedLayoutIncludesOpaqueBars = true

那么我所要做的就是改变edgesForExtendedLayoutextendedLayoutIncludesOpaqueBars

© www.soinside.com 2019 - 2024. All rights reserved.