UITableView 拖动距离与 UIRefreshControl



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

一切都工作正常,除了我必须滚动大约 80% 的屏幕才能触发 UIRefreshControl。有时我什至无法触发它,因为屏幕底部有一个选项卡栏,当手指到达它时会取消滚动移动。

我看过其他应用程序,即Apple的"邮件",其中UIRefreshControl仅在滚动屏幕的30%后触发。

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

提前致谢

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

仔细检查UIScrollView的高度,因为"拖动距离"只是该高度的百分比。UITableView也是如此,因为它是UIScrollView的孩子班。

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

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

您可能不需要使用 UIRefreshControl,

而只需使用 scrollViewDidScroll(或 tableViewDidScroll,如果是 tableView(来处理相应的刷新,因为 UIRefreshControl 无法修改。

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

经过一些广泛的测试和对UIKit的尝试,我得出了一个结论。

博士

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

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

测试设置

情节提要中的单个UIViewControllerUIView作为其view,而UIScrollView又具有唯一的子视图,而子视图又具有单个UIView作为子视图,top,right,bottom,left,width,height约束等于 superview 。视图控制器具有自由格式大小和1200p高度。

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

iPhone X simulator中运行应用程序并拖动 scrollView 以执行"拉取刷新"时,必须拖动更长的时间才能使 refreshControl 动画化并发送其被下拉的通知。

问题所在

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

解决方案

通过在设置正确的滚动视图大小后更新滚动视图的刷新控件,可以计算出正确的拖动距离。

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

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    
    let refreshControl = scrollView.refreshControl
    scrollView.refreshControl = nil
    scrollView.refreshControl = refreshControl
}

相关内容

  • 没有找到相关文章

最新更新