web-dev-qa-db-fra.com

UIRefreshControl sur UICollectionView ne fonctionne que si la collection remplit la hauteur du conteneur.

J'essaie d'ajouter une UIRefreshControl à une UICollectionView, mais le problème est que le contrôle d'actualisation n'apparaît que si la vue de la collection remplit la hauteur de son conteneur parent. En d'autres termes, à moins que la vue de collection soit suffisamment longue pour nécessiter un défilement, elle ne peut pas être abaissée pour révéler la vue du contrôle d'actualisation. Dès que la collection dépasse la hauteur de son conteneur parent, elle est abaissée et révèle la vue d'actualisation.

J'ai configuré un projet iOS rapide avec juste une UICollectionView dans la vue principale, avec un point de vente vers la vue de collection afin de pouvoir ajouter la UIRefreshControldans celle-ci dans viewDidLoad. Il existe également une cellule prototype avec l'identificateur de réutilisation cCell

Ceci est tout le code dans le contrôleur, et cela montre assez bien le problème. Dans ce code, je règle la hauteur de la cellule sur 100, ce qui n'est pas suffisant pour remplir l'affichage. Par conséquent, la vue ne peut pas être extraite et le contrôle d'actualisation ne s'affiche pas. Réglez-le sur une valeur supérieure pour remplir l'écran, puis cela fonctionne. Des idées?

@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);
}
139
Merott

Essaye ça:

self.collectionView.alwaysBounceVertical = YES;

Code complet pour une 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;
379
Larry

Attributs/Vue de défilement/Renvoi vertical dans Storyboard/Xib

 enter image description here

28
avdyushin

La réponse de Larry dans Swift:

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

Swift 3:

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

Si votre collectionview a une taille de contenu suffisante pour faire défiler verticalement, c'est correct, mais dans votre cas, ce n'est pas le cas. 

Vous devez activer la propriété AlwaysBounceVertical pour pouvoir définir self.collectionView.alwaysBounceVertical = YES;

1
Nghia Luong

Moi aussi, je faisais face au même problème, je ne pouvais pas utiliser UIRefreshControl tant que la taille du contenu de UICollectionView n'était pas assez grande pour faire défiler verticalement, 

La définition de la propriété bounces de UICollectionView a résolu ce problème. 

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

J'appelle beginRefreshing() juste après viewDidLoad(), mais sur certains écrans, cela ne fonctionne pas. Et seul collectionView.layoutIfNeeded() à viewDidLoad() m'a aidé

0
Nikolai Ischuk