我在 UITableView 上实现 UIRefreshControl 时遇到了一些麻烦。
一切正常,除了我必须滚动屏幕的 80% 才能触发 UIRefreshControl。有时我什至无法触发它,因为屏幕底部有一个标签栏,当手指到达它时它会取消滚动运动。
我查看了其他应用程序,即 Apple 的“邮件”,其中 UIRefreshControl 在仅滚动 30% 的屏幕后触发。
我错过了什么?在这方面真的需要帮助!
提前致谢
我在 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
不够聪明。要修复添加此代码viewDidAppear
或viewDidLayoutSubviews
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
高度。
在UIViewController
a的子类中UIRefreshControl
通过将 设置UIScrollView#refreshControl
为新的UIRefreshControl
里面来添加viewDidLoad
。
当在 an 中运行应用程序iPhone X simulator
并拖动 scrollView 以执行“拉动刷新”时,必须拖动相当长的时间以使 refreshControl 动画并发送它的通知,它被拉下。
我的一个假设是,一旦UIRefreshControl
将其dragging distance
添加到 scrollView 并且由于AutoLayout
尚未更新根视图在viewDidLoad
scrollView 处的子视图具有高度1180.0p
而不是正确的,768.0p
因此将计算 refreshControl 的dragging distance
高度1180.0p
而不是768.0p
和因此在运行应用程序时变得比预期的要长得多。
通过在设置正确的滚动视图大小后更新滚动视图的 refreshControl,可以计算正确的拖动距离。
此更新必须发生在已计算出正确大小的 scrollView 的函数中,例如viewDidAppear
和viewDidLayoutSubviews
。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let refreshControl = scrollView.refreshControl
scrollView.refreshControl = nil
scrollView.refreshControl = refreshControl
}