【问题标题】:UIRefreshControl jump and flash issuesUIRefreshControl 跳转和闪现问题
【发布时间】:2018-12-07 07:01:54
【问题描述】:

我有一个带有内置UIRefreshControlUITableViewController。我要修复的刷新动画有两个问题。

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

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

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

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

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

【问题讨论】:

  • 在 dispatch_async 方法中重新加载 tableView
  • 这让事情变得更糟。 UIRefreshControl 完全跳过动画,如果我使用这种方式,则会为表格视图设置错误的偏移量。
  • 您可以尝试将self.extendedLayoutIncludesOpaqueBars = YES 添加到您的控制器吗? UIRefreshControl 有很多这样的问题……
  • 我在处理 UIRefreshControl 和异步网络请求时从未遇到过这种行为。所以我猜你的代码中有些地方存在错误。
  • 当我在-reloadData 之后移动-endRefreshing 调用时,闪烁问题消失了。拖动时的跳跃似乎是由重新加载引起的。我还能如何重新加载?

标签: objective-c uirefreshcontrol


【解决方案1】:

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

  1. 需要设置“估计行高”属性。否则,reloadData() 会导致明显的跳跃。这是解释here

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

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

【讨论】:

    【解决方案2】:

    UIRefreshControl 在这一点上有点神秘(它受很多事情的影响 - 你是否使用大标题,将 refreshControl 设置在 viewDidLoad 或其他地方等等)

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

    我还能够以这种方式从您的 gif 中再现UIRefreshControl活动指示器闪烁(并且仅适用于没有导航栏半透明的 iPhone X 类设备)

    edgesForExtendedLayout = [.top]
    extendedLayoutIncludesOpaqueBars = true
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 2014-07-25
      相关资源
      最近更新 更多