J'essaie d'ajouter un UIRefreshControl
à un UICollectionView
, mais le problème est que le contrôle d'actualisation n'apparaît que si la vue de collection remplit la hauteur de son conteneur parent. En d'autres termes, à moins que la vue de collection ne soit suffisamment longue pour nécessiter un défilement, elle ne peut pas être tirée vers le bas pour révéler la vue de contrôle d'actualisation. Dès que la collection dépasse la hauteur de son conteneur parent, elle est tirée vers le bas et révèle la vue d'actualisation.
Je l' ai mis en place un projet iOS rapide avec juste UICollectionView
dans la vue principale, avec une sortie à la vue de la collecte afin que je puisse ajouter UIRefreshControl
à dans viewDidLoad
. Il existe également une cellule prototype avec l'identifiant de réutilisationcCell
C'est tout le code du contrôleur et cela illustre assez bien le problème. Dans ce code, j'ai défini 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 quelque chose de plus haut 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);
}
alwaysBounceVertical
Réponses:
Essaye ça:
self.collectionView.alwaysBounceVertical = YES;
Code complet pour un
UIRefreshControl
la source
[refreshControl endRefreshing]
.UIScrollView
(a superview ofUICollectionView
) arefreshControl
maintenant une propriété developer.apple.com/videos/play/wwdc2016/219/?time=2033Attributs / Vue de défilement / Rebondir verticalement dans Storyboard / Xib
la source
Réponse rapide de Larry:
Swift 3:
la source
UIColor.whiteColor()
couleur de votre choix.action: #selector(self.refresh)
Si votre
collectionview
contenu est suffisamment grand pour faire défiler verticalement, c'est OK, mais dans votre cas, ce n'est pas le cas.Vous devez activer la propriété
AlwaysBounceVertical
pour pouvoir définirself.collectionView.alwaysBounceVertical = YES;
la source
J'étais moi aussi confronté au même problème, je ne pouvais pas utiliser le
UIRefreshControl
tant que laUICollectionView
taille du contenu de n'était pas suffisamment grande pour faire défiler verticalement,Définition de la
bounces
propriété deUICollectionView
résolu cela source
J'appelle
beginRefreshing()
juste aprèsviewDidLoad()
, mais sur certains écrans, cela ne fonctionne pas. Et seulementcollectionView.layoutIfNeeded()
enviewDidLoad()
m'a aidéla source
Vous devez archiver l'appel d'API si la vue de collection est en état d'actualisation, puis terminer l'actualisation pour ignorer le contrôle d'actualisation.
la source