UICollectionViewController 中的拉取刷新

我想在 iOS6下的 UICollectionViewController中实现下拉刷新。这是很容易实现与 UITableViewController,像这样:

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

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

由于 UICollectionViewController是一个“更进化”的 UITableViewController,人们可能会期待某种特性的奇偶性,但我找不到任何地方的内置方式来实现这一点的参考。

  1. 有没有我没注意到的简单方法?
  2. UIRefreshControl是否可以与 UICollectionViewController一起使用,尽管头部和文档都声明 UIRefreshControl应该用于表视图?
32906 次浏览

(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;

那么一切都很完美。这个修正来自于 另一个帖子关于同一主题的修正(在另一个发布的答案的评论中引用)。

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

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

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

别忘了:

refreshCtrl.endRefreshing()

我正在使用故事板和设置 self.collectionView.alwaysBounceVertical = YES;不工作。选择 BouncesBounces Vertically为我做的工作。

enter image description here

从 iOS10开始,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;