UIRefreshControl需要被拉得太远

Lyr*_*nda 21 ios

我正在尝试UIRefreshControl在我的项目中实现一个UICollectionView.它按预期工作,但我需要拉动它旋转时UICollectionView的高度约3倍refreshControl(一旦用户放手).我见过其他应用程序,你只需要将它拉到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;
} 
Run Code Online (Sandbox Code Playgroud)

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

在这张图片中,我几乎已经启动了控制,我已经在屏幕上拉下了相当多的数量.

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

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

BB9*_*B9z 21

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

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

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

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

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

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


看看里面

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

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


ami*_*krd 5

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

快速 3:

内部 viewDidLoad() :

self.refresher = UIRefreshControl()
self.refresher.tintColor = UIColor.red
self.scrollView.addSubview(self.refresher)
Run Code Online (Sandbox Code Playgroud)

Next 如果你的 View 是一个 ViewController - 像这样实现 ScrollViewDelegate:

class YourViewController: UIViewController, UIScrollViewDelegate
Run Code Online (Sandbox Code Playgroud)

一旦你有你的 scrollView @IBoulet 链接......继续并在 viewDidLoad() 中将 scrollView 委托设置为 self ,如下所示:

self.scrollView.delegate = self
Run Code Online (Sandbox Code Playgroud)

接下来,由于您已经设置了委托,请设置 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")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,请注意我们没有

self.refresher.addTarget(self, action: #selector(self.Refresh()), for: UIControlEvents.valueChanged)
Run Code Online (Sandbox Code Playgroud)

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


小智 5

就我而言,我发现 UIviewcontroller 的模拟大小存在问题。

我只是对固定的 UIViewcontroller 的模拟大小进行更改。

这一改变解决了我的问题。