UIRefreshControl需要被拉得太远

我正在尝试在UIRefreshControl上的项目中实现UICollectionView 。 它按预期工作,但是当它旋转时(一旦用户放手),我需要将UICollectionView的高度拉大3倍。 我已经看过其他应用程序,你只需要在它旋转refreshControl的高度。 如何更改需要下拉的金额?

码:

 (void)viewDidLoad { [super viewDidLoad]; [self.collectionView setBackgroundColor:[UIColor clearColor]]; self.refreshControl = [UIRefreshControl new]; [self.refreshControl addTarget:self action:@selector(refreshFavorites) forControlEvents:UIControlEventValueChanged]; [self.collectionView addSubview:self.refreshControl]; self.collectionView.alwaysBounceVertical = YES; } 

随附图片,以帮助想象我的意思。 我的collectionView有一行(纯红色)。 red和refreshControl之间的空间就是我拉下来试图激活refreshControl

在这张图片中,我几乎已经激活了控件,我已经在屏幕上拉下了相当多的数量。

在此处输入图像描述

在这个图像中,我已经激活了控件并且它开始加载(在它跳跃~20-30像素之后,但它仍然突出显示这是多么重要)

在此处输入图像描述

此图像显示控件在激活并处于动画状态后处于“静止”状态。

在此处输入图像描述

我已经尝试设置UIRefreshControl的框架来尝试控制高度,但这不起作用。 我也改变了collectionView:layout:sizeForItemAtIndexPath的大小,但没有帮助。

如果需要将UIRefreshControl拉得太远而无法触发,则可能是iOS SDK的错误。

我建议使用视图控制器的帮助来解决这种情况:

 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // Force update the snapping height of refresh control. [self.refreshControl didMoveToSuperview]; } 

此外,如果您不介意使用私有API并需要更准确的控制,您可以这样写:

 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; @try { [self.refreshControl setValue:@(60) forKey:@"_snappingHeight"]; } @catch (NSException *exception) { } } 

这适用于iOS 7-10。 没有App Store审核问题。


看看里面

UIRefreshControl有一个名为snappingHeight的属性。 此属性控制用户需要拉下的距离。 但遗憾的是,此值始终未正确设置,尤其是您具有自定义视图层次结构。

UIRefreshControl有一个私有方法调用_updateSnappingHeight ,这个方法也在didMoveToSuperviewdidMoveToSuperview 。 因此,手动didMoveToSuperview调用可以更新错误的捕捉值。

对于仍在寻找答案的人。 到目前为止,我有一个明确的,最好的答案……

SWIFT 3:

在viewDidLoad()里面:

 self.refresher = UIRefreshControl() self.refresher.tintColor = UIColor.red self.scrollView.addSubview(self.refresher) 

Next如果你的View是ViewController – 像这样实现ScrollViewDelegate:

 class YourViewController: UIViewController, UIScrollViewDelegate 

一旦你将scrollView @IBOulet链接起来……继续并在viewDidLoad()中将scrollView委托设置为self,如下所示:

 self.scrollView.delegate = self 

接下来,既然您已设置了委托,请设置scrollViewDidScroll函数并实现它,以检查下拉的人是否像这样传递-90:

 func scrollViewDidScroll(_ scrollView: UIScrollView) { if scrollView == self.scrollView { if scrollView.contentOffset.y < -90 && !self.refresher.isRefreshing{ self.refresher.beginRefreshing() self.Refresh() print("zz refreshing") } } } 

现在,请注意我们没有

 self.refresher.addTarget(self, action: #selector(self.Refresh()), for: UIControlEvents.valueChanged) 

我们也根本不需要它。 相反,我们调用beginRefresh()后跟实际函数...只需确保在你希望它结束​​的地方调用endRefresh()

在iOS 10.2中存在这个问题所以对于仍然遭受这种情况的人来说,我找到了一种方法来实现它,而无需触及私有API方法(尽管这确实解决了这个问题)。

我发现当设备在iPad上旋转时我遇到了问题。 UIRefreshControl在纵向表现不错,但在旋转设备时会出现问题。 在那之后,无论它处于何种方向都无关紧要,它总是需要拖得太远而不需要被激活。

我的解决方案基于这个答案: 抵消UIRefreshControl

每当设备旋转并且它工作时,我尝试设置UIRefreshControl的框架。 它并不理想,因为它不使用AutoLayout,但它比使用私有API更清洁。

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:UIDeviceOrientationDidChangeNotification object:nil]; -(void)didRotate:(NSNotification *)notification { [self.refreshControl setFrame:CGRectMake(0, 0, 20, 20)]; [self.refreshControl setNeedsLayout]; }