我在UITableView上实现UIRefreshControl时遇到了一些麻烦。
一切都工作正常,除了我必须滚动大约 80% 的屏幕才能触发 UIRefreshControl。有时我什至无法触发它,因为屏幕底部有一个选项卡栏,当手指到达它时会取消滚动移动。
我看过其他应用程序,即Apple的"邮件",其中UIRefreshControl仅在滚动屏幕的30%后触发。
我错过了什么?真的需要帮助!
提前致谢
我遇到了类似的问题,很可能这对您来说是相同的原因。对我来说,我隐藏了滚动指示器,使我无法看到问题的明显原因:UIScrollView
的高度远大于其superView
......
仔细检查UIScrollView
的高度,因为"拖动距离"只是该高度的百分比。UITableView
也是如此,因为它是UIScrollView
的孩子班。
编辑:似乎这不是重现此问题的唯一方法,因为触发刷新器所需的拖动距离是以错误的方式计算的。有关详细信息,请参阅此问题。
但一般来说,如果你UIScrollView
的高度与他的父容器不同(例如屏幕本身(,就会发生这种情况。
而只需使用 scrollViewDidScroll(或 tableViewDidScroll,如果是 tableView(来处理相应的刷新,因为 UIRefreshControl 无法修改。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if ((scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height)
{
// Refresh from here
}
}
经过一些广泛的测试和对UIKit的尝试,我得出了一个结论。
博士
UIRefreshControl
不够聪明。若要修复,请在viewDidAppear
或viewDidLayoutSubviews
中添加此代码
let refreshControl = scrollView.refreshControl
scrollView.refreshControl = nil
scrollView.refreshControl = refreshControl
测试设置
情节提要中的单个UIViewController
,UIView
作为其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 正确大小的函数中进行,例如 viewDidAppear
和 viewDidLayoutSubviews
。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let refreshControl = scrollView.refreshControl
scrollView.refreshControl = nil
scrollView.refreshControl = refreshControl
}