UICollectionViewのUIRefreshControlは、コレクションがコンテナーの高さを満たす場合にのみ機能します


142

私が追加しようとしているUIRefreshControlUICollectionViewが、問題がコレクションビューは、親コンテナの高さをいっぱいにしない限り、リフレッシュ制御が表示されないということです。言い換えると、コレクションビューがスクロールを必要とするほど長い場合を除いて、コレクションコントロールをプルダウンして更新コントロールビューを表示することはできません。コレクションが親コンテナの高さを超えるとすぐに、コレクションがプルダウンされ、更新ビューが表示されます。

私はUICollectionView、メインビューの内側にコレクションビューへのアウトレットを備えた簡単なiOSプロジェクトを設定しました。UIRefreshControlこれにより、に追加できviewDidLoadます。再利用識別子を持つプロトタイプセルもあります。cCell

これはコントローラー内のすべてのコードであり、問​​題をかなりよく示しています。このコードでは、セルの高さを100に設定しました。これは、表示を埋めるには不十分であるため、ビューをプルできず、更新コントロールが表示されません。ディスプレイを埋めるためにそれをより高い値に設定すると、機能します。何か案は?

@interface ViewController () <UICollectionViewDelegateFlowLayout, UICollectionViewDataSource>
@property (strong, nonatomic) IBOutlet UICollectionView *collectionView;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
    [self.collectionView addSubview:refreshControl];
}

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    return 1;
}

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return 1;
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    return [collectionView dequeueReusableCellWithReuseIdentifier:@"cCell" forIndexPath:indexPath];
}

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return CGSizeMake(self.view.frame.size.width, 100);
}


1
使用alwaysBounceVertical
onmyway133

回答:


395

これを試して:

self.collectionView.alwaysBounceVertical = YES;

の完全なコード UIRefreshControl

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
refreshControl.tintColor = [UIColor grayColor];
[refreshControl addTarget:self action:@selector(refershControlAction) forControlEvents:UIControlEventValueChanged];
[self.collectionView addSubview:refreshControl];
self.collectionView.alwaysBounceVertical = YES;

1
すばらしい、その行は正確な修正であり、コードの残りの部分は問題ではありません。StackOverflowの悪いスタートではありません!乾杯!
メロット、2013

7
はい、問題ありません。私が初心者であることは明らかです。とにかく、あなたの投稿を見たとき、私は同じ状況で行き詰まっていることがわかりました。私が解決策を見つけたとき、私は間違いなくそれを共有するべきです。乾杯
ラリー

6
さて、フアン、あなたはおそらくあなたの質問に対する答えをすでに見つけています。ただし、更新後に更新コントロールを通常の状態に戻すには、を呼び出す必要があります[refreshControl endRefreshing]
メロット2013

2
残念ながら、これはサポートされていません。UIRefreshControlはUITableViewControllerでのみ使用でき、現在は厳密に実施されています。
ルークヴァン2014年

3
IOSの10にUIScrollView(のスーパーUICollectionView)がrefreshControl今性をdeveloper.apple.com/videos/play/wwdc2016/219/?time=2033
ストリー


23

ラリーの答えは素早く:

    let refreshControl = UIRefreshControl()
    refreshControl.tintColor = UIColor.blueColor()
    refreshControl.addTarget(self, action: "refresh", forControlEvents: .ValueChanged)
    collectionView.addSubview(refreshControl)
    collectionView.alwaysBounceVertical = true

スウィフト3:

    let refreshControl = UIRefreshControl()
    refreshControl.tintColor = .blue
    refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged)
    collectionView.addSubview(refreshControl)
    collectionView.alwaysBounceVertical = true

Constは未定義変数のエラーを出します。誰かが同じ状況に遭遇した場合は、それをUIColor.whiteColor()好きな色に置き換えてください。
ファイサル

1
また、Swift 2.2の使用action: #selector(self.refresh)
Faisal

1

collectionview縦にスクロールするのに十分な大きさのコンテンツがある場合は問題ありませんが、あなたの場合はそうではありません。

プロパティを有効にする必要があるため、AlwaysBounceVertical次のように設定できます。self.collectionView.alwaysBounceVertical = YES;


0

私も同じ問題に直面しており、のコンテンツサイズが垂直方向にスクロールできるほど大きくなるUIRefreshControlまで、を使用できませんでしたUICollectionView

これbouncesUICollectionView解決するプロパティを設定する

[self.collectionView setBounces:YES];
[self.collectionView setAlwaysBounceVertical:YES];

0

beginRefreshing()直後に電話をかけviewDidLoad()ていますが、一部の画面では機能しません。そしてcollectionView.layoutIfNeeded()viewDidLoad()私を助けただけで


0

コレクションビューが更新状態にある場合はAPI呼び出しをチェックインし、更新を終了して更新コントロールを終了する必要があります。

private let refreshControl = UIRefreshControl()
 refreshControl.tintColor = .white
 refreshControl.addTarget(self, action: #selector(refreshData), for: .valueChanged)
 collectionView.addSubview(refreshControl)
 @objc func refreshData() {
    // API Call
 }
// Disable refresh control if already refreshing 
if refreshControl.isRefreshing {
    refreshControl.endRefreshing()
}

ストーリーボードファイルでスクロール時のバウンスが有効になっていることに注意してください。
アサドジャミル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.