72

我想在 iOS 6 下实现下拉刷新UICollectionViewController。这很容易用 a 实现UITableViewController,如下所示:

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(startRefresh:)
    forControlEvents:UIControlEventValueChanged];
self.refreshControl = refreshControl;

上面实现了一个很好的液滴动画作为原生小部件的一部分。

正如UICollectionViewController“更进化”UITableViewController的那样,人们会期望一些功能具有一定的相同性,但我无法在任何地方找到实现这一点的内置方法的参考。

  1. 有没有一种我忽略的简单方法可以做到这一点?
  2. 尽管标题和文档都说明它是为了与表格视图一起使用,但可以UIRefreshControl以某种方式使用吗?UICollectionViewController
4

5 回答 5

215

(1) 和 (2) 的答案都是肯定的。

只需添加一个UIRefreshControl实例作为子视图,.collectionView它就可以工作。

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(startRefresh:)
    forControlEvents:UIControlEventValueChanged];
[self.collectionView addSubview:refreshControl];

而已!我希望这在某个地方的文档中被提及,即使有时一个简单的实验就可以解决问题。

编辑:如果集合不够大而不能有活动的滚动条,则此解决方案将不起作用。如果添加此语句,

self.collectionView.alwaysBounceVertical = YES;

然后一切正常。此修复程序取自同一主题的另一篇文章(在其他已发布答案的评论中引用)。

于 2012-10-26T22:52:57.423 回答
18

我一直在寻找相同的解决方案,但在 Swift 中。基于上述答案,我做了以下事情:

let refreshCtrl = UIRefreshControl()
    ...
refreshCtrl.addTarget(self, action: "startRefresh", forControlEvents: .ValueChanged)
collectionView?.addSubview(refreshCtrl)

不要忘记:

refreshCtrl.endRefreshing()
于 2015-01-07T13:19:41.043 回答
7

我正在使用 Storyboard 并且设置self.collectionView.alwaysBounceVertical = YES;不起作用。选择BouncesandBounces Vertically为我完成了这项工作。

在此处输入图像描述

于 2015-04-19T13:46:32.387 回答
4

refreshControl属性现在已添加到UIScrollViewiOS 10 中,因此您可以直接在集合视图上设置刷新控件。

https://developer.apple.com/reference/uikit/uiscrollview/2127691-refreshcontrol

UIRefreshControl *refreshControl = [UIRefreshControl new];
[refreshControl addTarget:self action:@selector(refreshControlAction:) forControlEvents:UIControlEventValueChanged];
self.collectionView.refreshControl = refreshControl;    
于 2016-11-04T00:44:29.850 回答
2

mjh 的回答是正确的。

我遇到了一个问题,如果collectionView.contentSize不大于collectionView.frame.size,则无法collectionView滚动。您也不能设置该contentSize属性(至少我不能)。

如果它不能滚动,它不会让你拉动刷新。

我的解决方案是子类UICollectionViewFlowLayout化并覆盖该方法:

- (CGSize)collectionViewContentSize
{
    CGFloat height = [super collectionViewContentSize].height;

    // Always returns a contentSize larger then frame so it can scroll and UIRefreshControl will work
    if (height < self.collectionView.bounds.size.height) {
        height = self.collectionView.bounds.size.height + 1;
    }

    return CGSizeMake([super collectionViewContentSize].width, height);
}
于 2013-03-27T17:01:55.877 回答