8

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

一切正常,除了我必须滚动屏幕的 80% 才能触发 UIRefreshControl。有时我什至无法触发它,因为屏幕底部有一个标签栏,当手指到达它时它会取消滚动运动。

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

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

提前致谢

4

3 回答 3

2

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

仔细检查您UIScrollView的高度,因为“拖动距离”只是该高度的百分比。也是UITableView如此,因为它是UIScrollView.

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

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

于 2013-06-05T19:54:03.123 回答
1

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

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if ((scrollView.contentOffset.y + scrollView.frame.size.height) >=    scrollView.contentSize.height)
    {
        // Refresh from here
    }
}
于 2013-05-03T14:57:44.540 回答
0

经过一些广泛的测试和使用 UIKit 后,我​​得出了一个结论。

TL;博士

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

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

测试设置

UIViewController在 Storyboard 中以 aUIView作为其单,view而后者又具有一个UIScrollView仅作为子视图,而该子视图又具有一个UIView作为子视图,其top,right,bottom,left,width,height约束等于superview. viewController 具有自由形式的大小和1200p高度。

UIViewControllera的子类中UIRefreshControl通过将 设置UIScrollView#refreshControl为新的UIRefreshControl里面来添加viewDidLoad

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

问题

我的一个假设是,一旦UIRefreshControl将其dragging distance添加到 scrollView 并且由于AutoLayout尚未更新根视图在viewDidLoadscrollView 处的子视图具有高度1180.0p而不是正确的,768.0p因此将计算 refreshControl 的dragging distance高度1180.0p而不是768.0p和因此在运行应用程序时变得比预期的要长得多。

解决方案

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

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

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    
    let refreshControl = scrollView.refreshControl
    scrollView.refreshControl = nil
    scrollView.refreshControl = refreshControl
}
于 2019-04-09T14:03:29.950 回答