IOS 6のUICollectionViewController
にpull-down-to-refreshを実装したい。これは、次のようにUITableViewController
で簡単に実現できました。
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(startRefresh:)
forControlEvents:UIControlEventValueChanged];
self.refreshControl = refreshControl;
上記は、ネイティブウィジェットの一部としてニースの液滴アニメーションを実装しています。
UICollectionViewController
は「より進化した」UITableViewController
であるため、機能の同等性がある程度期待されますが、これを実装する組み込み方法への参照はどこにもありません。
UIRefreshControl
をUICollectionViewController
と一緒に使用できますか?(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 から取られました(他の投稿された回答のコメントで参照されます)。
私は同じソリューションを探していましたが、Swiftでした。上記の回答に基づいて、次のことを行いました。
let refreshCtrl = UIRefreshControl()
...
refreshCtrl.addTarget(self, action: "startRefresh", forControlEvents: .ValueChanged)
collectionView?.addSubview(refreshCtrl)
忘れないで:
refreshCtrl.endRefreshing()
Storyboardを使用していて、self.collectionView.alwaysBounceVertical = YES;
の設定が機能しませんでした。 Bounces
とBounces Vertically
を選択すると、仕事ができます。
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;
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);
}