web-dev-qa-db-ja.com

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

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

メインビュー内にUICollectionViewだけで、コレクションビューへのアウトレットを使用して、UIRefreshControlviewDidLoadに追加できるように、簡単なiOSプロジェクトをセットアップしました。再利用識別子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);
}
142
Merott

これを試して:

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;
389
Larry

ストーリーボード/ Xibで属性/スクロールビュー/垂直方向にバウンス

enter image description here

29
avdyushin

SwiftでのLarryの答え:

    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
21

collectionviewのコンテンツサイズが垂直方向にスクロールするのに十分な大きさであれば、問題ありませんが、あなたの場合はそうではありません。

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

1
Nghia Luong

私も同じ問題に直面していました。UIRefreshControlのコンテンツサイズが垂直にスクロールするのに十分な大きさになるまで、UICollectionViewを使用できませんでした。

bouncesUICollectionViewプロパティを設定すると、これが解決しました

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

beginRefreshing()の直後にviewDidLoad()を呼び出していますが、一部の画面では機能しません。 collectionView.layoutIfNeeded()viewDidLoad()だけが私を助けてくれました

0
Nikolai Ischuk