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 UIRefreshControl
dans 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);
}
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;
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
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;
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];
J'appelle beginRefreshing()
juste après viewDidLoad()
, mais sur certains écrans, cela ne fonctionne pas. Et seul collectionView.layoutIfNeeded()
à viewDidLoad()
m'a aidé