我在UITableView上实现UIRefreshControl时遇到了一些麻烦。
一切都工作得很好,除了我必须滚动80%的屏幕才能触发UIRefreshControl。有时我甚至无法触发它,因为屏幕底部有一个标签栏,当手指到达时会取消滚动动作。
我查看了其他应用程序,即Apple的'Mail',其中仅滚动屏幕的30%后触发UIRefreshControl。
我错过了什么?真的需要这方面的帮助!
提前致谢
我遇到了类似的问题,这很可能是你的原因。对我来说,我隐藏滚动指示器使我无法看到问题的明显原因:UIScrollView
的高度比它的superView
大得多......
仔细检查你的UIScrollView
的高度,因为“拖动距离”它只是该高度的一个百分比。同样适用于UITableView
,因为它是UIScrollView
的儿童类。
编辑:似乎这不是重现此问题的唯一方法,因为触发刷新的所需拖动距离是以错误的方式计算的。有关更多信息,请参阅this question。
但一般来说,如果你的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
不够聪明。要修复在viewDidAppear
或viewDidLayoutSubviews
中添加此代码
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
一旦被添加到scrollView就得到它的dragging distance
集,并且由于AutoLayout
没有在viewDidLoad
更新根视图的子视图,scrollView的高度为1180.0p
而不是正确的768.0p
因此refreshControl的dragging distance
将是计算高度1180.0p
而不是768.0p
,因此在运行应用程序时变得比预期长得多。
通过在设置了scrollView的正确大小后更新scrollView的refreshControl,将计算正确的拖动距离。
此更新必须在已计算scrollView的正确大小的函数中进行,例如viewDidAppear
和viewDidLayoutSubviews
。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let refreshControl = scrollView.refreshControl
scrollView.refreshControl = nil
scrollView.refreshControl = refreshControl
}