UICollectionViewController中的Pull-to-refresh

时间:2012-10-26 11:00:23

标签: ios6 uikit pull-to-refresh

我想在iOS 6下的UICollectionViewController中实现下拉到刷新。使用UITableViewController很容易实现这一点,如下所示:

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

以上实现了一个漂亮的液滴动画作为原生小部件的一部分。

由于UICollectionViewController是一个“更进化的”UITableViewController,人们会期望某种功能的奇偶性,但我找不到任何内容的引用来实现它。< / p>

  1. 有一种简单的方法可以做到这一点,我忽略了吗?
  2. UIRefreshControl可以UICollectionViewController以某种方式使用{{1}},尽管标题和文档都声明它可以用于表格视图吗?

5 个答案:

答案 0 :(得分: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;

然后一切都很完美。此修复取自another post对同一主题(在其他已发布答案的评论中引用)。

答案 1 :(得分:18)

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

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

不要忘记:

refreshCtrl.endRefreshing()

答案 2 :(得分:7)

我使用的是故事板,而self.collectionView.alwaysBounceVertical = YES;设置不起作用。选择BouncesBounces Vertically可以帮我完成工作。

enter image description here

答案 3 :(得分:4)

从iOS 10开始,refreshControl属性已添加到UIScrollView,因此您可以直接在集合视图上设置刷新控件。

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;    

答案 4 :(得分: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);
}