1. ホーム
  2. ios

[解決済み] UICollectionView上のUIRefreshControlは、コレクションがコンテナの高さを満たした場合にのみ動作する

2022-05-03 22:49:31

質問

を追加しようとしています。 UIRefreshControlUICollectionView しかし、問題は、コレクション・ビューがその親コンテナの高さを満たさない限り、リフレッシュ・コントロールが表示されないことです。言い換えれば、コレクションビューがスクロールを必要とするほど長くなければ、リフレッシュコントロールビューを表示するためにプルダウンすることはできません。コレクションが親コンテナの高さを超えた時点で、コレクションはプルダウンされ、リフレッシュビューが表示されます。

簡単なiOSプロジェクトを立ち上げてみました。 UICollectionView メインビューの内部には、コレクションビューへのアウトレットがあり、そのアウトレットに 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);
}

解決方法は?

これを試してみてください。

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;