UIRefreshControl跳转和闪退问题
UIRefreshControl jump and flash issues
我有一个 UITableViewController
和 built-in UIRefreshControl
。我想修复刷新动画的两个问题。
当我拖拉 table 视图时,它开始从我们的服务器更新数据。如果用户一直拖动它,就会发生明显的偏移跳跃。
当刷新操作结束时,table 视图隐藏动画的刷新控件。隐藏完成后,控件会闪烁几帧。
控件是从 UIStoryboard 设置的。我从那里设置目标和色调颜色。当动作触发时,我的代码刷新来自我们服务器的数据,当服务器响应时它有一个回调。我从那里停止刷新控制:
dispatch_async(dispatch_get_main_queue(), ^{
[self.refreshControl endRefreshing];
});
...
[self.tableView reloadData];
是我做错了什么还是 UIRefreshControl
只是 iOS 11 中的错误?
我遇到了类似的问题,这就是我最终解决它的方法:
需要设置'estimated row height'属性。否则,reloadData()
会导致明显的跳跃。这是解释
在用户仍在拖动时调用 endRefreshing()
也会导致明显的跳跃。为避免这种情况:
- 当我从服务器接收到新数据时,我会检查用户是否仍在拖动 (
UIScrollView.isDragging
)。如果是这种情况,那么我不会立即调用 endRefreshing()
,而是设置一个标志。
- 我覆盖
scrollViewDidEndDragging
并检查那里的标志;如果设置,那么我调用 endRefreshing()
并清除标志。
UIRefreshControl
此时有点神秘(它受很多因素影响-你使用大标题吗,在viewDidLoad
中设置refreshControl
或其他地方等)
摆脱这些问题的最佳方法是停止观察 UIRefreshControl
的 valueChanged
并在确定存在后执行 reloadData
/ endRefreshing
没有拖动(例如 scrollViewDidEndDragging
)。
我还能够通过这种方式从您的 gif 中重现 activity 闪烁 的 UIRefreshControl
指示器(并且仅适用于 iPhone X-like 没有导航栏半透明的设备):
edgesForExtendedLayout = [.top]
extendedLayoutIncludesOpaqueBars = true
然后我所要做的就是更改 edgesForExtendedLayout
和 extendedLayoutIncludesOpaqueBars
。
我有一个 UITableViewController
和 built-in UIRefreshControl
。我想修复刷新动画的两个问题。
当我拖拉 table 视图时,它开始从我们的服务器更新数据。如果用户一直拖动它,就会发生明显的偏移跳跃。
当刷新操作结束时,table 视图隐藏动画的刷新控件。隐藏完成后,控件会闪烁几帧。
控件是从 UIStoryboard 设置的。我从那里设置目标和色调颜色。当动作触发时,我的代码刷新来自我们服务器的数据,当服务器响应时它有一个回调。我从那里停止刷新控制:
dispatch_async(dispatch_get_main_queue(), ^{
[self.refreshControl endRefreshing];
});
...
[self.tableView reloadData];
是我做错了什么还是 UIRefreshControl
只是 iOS 11 中的错误?
我遇到了类似的问题,这就是我最终解决它的方法:
需要设置'estimated row height'属性。否则,
reloadData()
会导致明显的跳跃。这是解释在用户仍在拖动时调用
endRefreshing()
也会导致明显的跳跃。为避免这种情况:- 当我从服务器接收到新数据时,我会检查用户是否仍在拖动 (
UIScrollView.isDragging
)。如果是这种情况,那么我不会立即调用endRefreshing()
,而是设置一个标志。 - 我覆盖
scrollViewDidEndDragging
并检查那里的标志;如果设置,那么我调用endRefreshing()
并清除标志。
- 当我从服务器接收到新数据时,我会检查用户是否仍在拖动 (
UIRefreshControl
此时有点神秘(它受很多因素影响-你使用大标题吗,在viewDidLoad
中设置refreshControl
或其他地方等)
摆脱这些问题的最佳方法是停止观察 UIRefreshControl
的 valueChanged
并在确定存在后执行 reloadData
/ endRefreshing
没有拖动(例如 scrollViewDidEndDragging
)。
我还能够通过这种方式从您的 gif 中重现 activity 闪烁 的 UIRefreshControl
指示器(并且仅适用于 iPhone X-like 没有导航栏半透明的设备):
edgesForExtendedLayout = [.top]
extendedLayoutIncludesOpaqueBars = true
然后我所要做的就是更改 edgesForExtendedLayout
和 extendedLayoutIncludesOpaqueBars
。