UITableView使用UIRefreshControl拖动距离

时间:2013-05-03 14:13:45

标签: ios uitableview uiscrollview refresh uirefreshcontrol

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

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

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

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

提前致谢

3 个答案:

答案 0 :(得分:2)

我遇到了类似的问题,这很可能与你的原因相同。 对我而言,我隐藏了滚动指示器,使我无法看到问题的明显原因:UIScrollView的高度远远高于其superView ......

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

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

但总的来说,如果UIScrollView的高度与其父容器(例如屏幕本身)不同,则会发生这种情况。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

在进行了广泛的测试并使用UIKit之后,我得出了一个结论。

TL; DR

UIRefreshControl不够聪明。要解决此问题,请在viewDidAppearviewDidLayoutSubviews

中添加此代码
let refreshControl = scrollView.refreshControl
scrollView.refreshControl = nil
scrollView.refreshControl = refreshControl

测试设置

情节提要中的单个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动画并发送其被拉下的通知。

问题

我的一个假设是,UIRefreshControl设置为dragging distance后,将其添加到scrollView中,并且由于AutoLayout尚未更新{{1}处的根视图的子视图} scrollView的高度为viewDidLoad而不是正确的1180.0p,因此,将针对高度768.0p而不是dragging distance来计算refreshControl的1180.0p,从而成为运行应用程序的时间比预期的要长得多。

解决方案

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

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

viewDidLayoutSubviews