我在UITableView上实现UIRefreshControl时遇到了一些麻烦。
除了我必须滚动80%的屏幕以便UIRefreshControl被触发之外,一切都工作得很好。有时我甚至无法触发它,因为屏幕底部有一个标签栏,当手指到达时会取消滚动动作。
我查看了其他应用,即Apple' Mail',在仅滚动屏幕的30%后触发UIRefreshControl。
我错过了什么?真的需要这方面的帮助!
提前致谢
答案 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之后,我得出了一个结论。
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
设置为dragging distance
后,将其添加到scrollView中,并且由于AutoLayout
尚未更新{{1}处的根视图的子视图} scrollView的高度为viewDidLoad
而不是正确的1180.0p
,因此,将针对高度768.0p
而不是dragging distance
来计算refreshControl的1180.0p
,从而成为运行应用程序的时间比预期的要长得多。
在为scrollView设置了正确的大小之后,通过更新scrollView的refreshControl,可以计算出正确的拖动距离。
此更新必须在已计算正确的scrollView大小的函数中进行,例如768.0p
和viewDidAppear
。
viewDidLayoutSubviews