72

UICollectionViewControlleriOS 6では、プルダウンから更新までを実装したいと思います。これは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

ストーリーボードを使用していましたが、設定self.collectionView.alwaysBounceVertical = YES;が機能しませんでした。を選択するBouncesBounces Vertically、私に代わって仕事をします。

ここに画像の説明を入力してください

于 2015-04-19T13:46:32.387 に答える
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;    
于 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 に答える