我在上一个UITableView实施UIRefreshControl一些麻烦。
一切工作正常,除了一个事实,我要像滚动屏幕的80%后话了UIRefreshControl到被触发。 有时候,我甚至能够触发它,因为没有在屏幕上,当手指到达它这将取消滚动运动底部的标签栏。
我看其他的应用程序,也就是苹果的“邮件”,其中UIRefreshControl正在滚动只有30%的画面后触发。
我在想什么? 真的需要在这一个帮助!
提前致谢
我在上一个UITableView实施UIRefreshControl一些麻烦。
一切工作正常,除了一个事实,我要像滚动屏幕的80%后话了UIRefreshControl到被触发。 有时候,我甚至能够触发它,因为没有在屏幕上,当手指到达它这将取消滚动运动底部的标签栏。
我看其他的应用程序,也就是苹果的“邮件”,其中UIRefreshControl正在滚动只有30%的画面后触发。
我在想什么? 真的需要在这一个帮助!
提前致谢
我有一个类似的问题,它很可能这对你同样的原因。 对我来说,碰巧我墙根的滚动指示让我无法看到问题的明显原因: UIScrollView
的高度比它大得多superView
...
仔细检查您UIScrollView
的高度,因为‘拖距离’这只是高度的百分比。 也是一样UITableView
也一样,因为它是一个子类的UIScrollView
。
编辑:看来,这不是重现此问题的唯一方法,因为所需的拖动距离触发复习的童车的方式进行计算。 请参阅此问题的更多信息。
但总的来说它会发生,如果你UIScrollView
的身高比他的父容器不同(例如屏幕本身)。
你可能需要在处理您刷新据此,因为UIRefreshControl不能修改无法使用UIRefreshControl,只是利用scrollViewDidScroll(或tableViewDidScroll如果的tableView)。
- (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
和拖动滚动视图来执行“拉刷新”一个人必须拖动相当长的时间,使动画refreshControl并发送其通知就被推倒。
我的一个假设是, UIRefreshControl
获得其dragging distance
设置,一旦它被添加到滚动视图和自AutoLayout
在hasen't更新根视图的子视图viewDidLoad
滚动视图具有的高度1180.0p
而不是正确的768.0p
因此refreshControl的dragging distance
将被计算为高度1180.0p
代替768.0p
,因此在运行应用程序时变得比预期更长。
通过为滚动视图正确的尺寸之后更新了滚动的refreshControl已设置的计算正确的拖动距离。
此更新的发生在所述滚动视图的正确大小已被计算出的函数,例如viewDidAppear
和viewDidLayoutSubviews
。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let refreshControl = scrollView.refreshControl
scrollView.refreshControl = nil
scrollView.refreshControl = refreshControl
}