在UICollectionViewController中拉入刷新


72

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

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

上面的代码实现了一个不错的液滴动画,作为本地小部件的一部分。

作为UICollectionViewController一种“更加进化的”产品,UITableViewController人们会期望某种程度的功能均等,但是我在任何地方都找不到实现此功能的内置方法的参考。

  1. 有一个简单的方法可以让我忽略吗?
  2. 尽管标头和文档都声明将其与表视图UIRefreshControl一起使用,UICollectionViewController但可以以某种方式使用它吗?

Answers:


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;

那么一切都会完美地进行。此修复程序来自同一主题的另一篇文章(在另一篇已发布答案的评论中引用)。


51
我必须指出,UIRefreshControl.alloc.init是点符号的滥用。点表示法是为了传达访问内部状态,而括号表示法是为了传达您希望对象执行某些操作。
彼得·威尔西

1
可以将其视为延迟加载,其中要访问的内部状态是初始化的实例。舒展一下,但这比我最初的答复是“:p”要好。:)
mjh 2012年

如果您要在此处使用点符号,则我更喜欢UIRefreshControl.new
JLundell 2013年

2
@JuanGonzález:将控件设置为ala的iVar,_refreshControl = blah然后在中startRefresh:,在完成工作后执行_refreshControl endRefreshing];
2013年

1
如果有人感兴趣并使用Swift,我为UICollectionViewController编写了一个快速简单的扩展,以获取refreshControl的便利变量。gist.github.com/Baza207/f5ff5abf7b8c44e2ffb3
Baza207

18

我在寻找相同的解决方案,但是在Swift中。基于以上答案,我已经做了以下工作:

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

不要忘记:

refreshCtrl.endRefreshing()

7

我正在使用情节提要,但设置self.collectionView.alwaysBounceVertical = YES;不起作用。选择BouncesBounces Vertically为我完成工作。

在此处输入图片说明



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);
}

13
您也可以self.collectionView.alwaysBounceVertical = YES;。这个答案值得赞扬
BFar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.