UITableView使用UIRefreshControl拖动距离

问题描述 投票:8回答:3

我在UITableView上实现UIRefreshControl时遇到了一些麻烦。

一切都工作得很好,除了我必须滚动80%的屏幕才能触发UIRefreshControl。有时我甚至无法触发它,因为屏幕底部有一个标签栏,当手指到达时会取消滚动动作。

我查看了其他应用程序,即Apple的'Mail',其中仅滚动屏幕的30%后触发UIRefreshControl。

我错过了什么?真的需要这方面的帮助!

提前致谢

ios uitableview uiscrollview refresh uirefreshcontrol
3个回答
2
投票

我遇到了类似的问题,这很可能是你的原因。对我来说,我隐藏滚动指示器使我无法看到问题的明显原因:UIScrollView的高度比它的superView大得多......

仔细检查你的UIScrollView的高度,因为“拖动距离”它只是该高度的一个百分比。同样适用于UITableView,因为它是UIScrollView的儿童类。

编辑:似乎这不是重现此问题的唯一方法,因为触发刷新的所需拖动距离是以错误的方式计算的。有关更多信息,请参阅this question

但一般来说,如果你的UIScrollView的高度与他的父容器不同(例如屏幕本身),就会发生这种情况。


1
投票

您可能不需要使用UIRefreshControl并且仅使用scrollViewDidScroll(或tableViewDidScroll,如果是tableView)来处理您的刷新,因为UIRefreshControl无法修改。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if ((scrollView.contentOffset.y + scrollView.frame.size.height) >=    scrollView.contentSize.height)
    {
        // Refresh from here
    }
}

0
投票

经过一些广泛的测试并与UIKit一起玩,我得出了一个结论。

TL;DR

UIRefreshControl不够聪明。要修复在viewDidAppearviewDidLayoutSubviews中添加此代码

let refreshControl = scrollView.refreshControl
scrollView.refreshControl = nil
scrollView.refreshControl = refreshControl

Test setup

在故事板中单个UIViewController,其中UIView作为其view,而UIScrollView作为唯一的子视图,而UIView又作为子视图,top,right,bottom,left,width,height约束等于superview。 viewController具有自由形式的大小,1200p高度。

UIViewController的子类中,通过将UIRefreshControl设置为UIScrollView#refreshControl内的新UIRefreshControl来添加viewDidLoad

iPhone X simulator中运行应用程序并拖动scrollView以执行“拉动刷新”时,必须拖动相当长的时间以使refreshControl动画并发送其通知,然后将其拉下。

The problem

我的一个假设是UIRefreshControl一旦被添加到scrollView就得到它的dragging distance集,并且由于AutoLayout没有在viewDidLoad更新根视图的子视图,scrollView的高度为1180.0p而不是正确的768.0p因此refreshControl的dragging distance将是计算高度1180.0p而不是768.0p,因此在运行应用程序时变得比预期长得多。

The solution

通过在设置了scrollView的正确大小后更新scrollView的refreshControl,将计算正确的拖动距离。

此更新必须在已计算scrollView的正确大小的函数中进行,例如viewDidAppearviewDidLayoutSubviews

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    let refreshControl = scrollView.refreshControl
    scrollView.refreshControl = nil
    scrollView.refreshControl = refreshControl
}
© www.soinside.com 2019 - 2024. All rights reserved.