Je fais un simple UICollectionView
avec un mécanisme de pagination activé, et tout fonctionne bien. Cependant, lorsque vous faites défiler jusqu'à la dernière page, le nombre de cellules n'est pas entièrement visible à l'écran et la dernière page contient certaines cellules de la page précédente.
Comment puis-je développer le contentSize
du UICollectionView
afin que la dernière page ne contienne aucune cellule de la page précédente?
Un exemple ici : le UICollectionView
défile horizontalement avec 6 cellules, de cette façon:
Page 1: cell0 - cell1 - cell2 - cell3
Faites défiler: cell2-cell3-cell4-cell5 // Pas prévu: comment passer à: cell4 - cellule 5 dans la page2.
RÉSUMÉ:
Je veux mettre
collectionView.contentSize = numberOfPage * collectionView.frame
[~ # ~] pas [~ # ~]
collectionView.contentSize = numberOfCell * (cellFrame + spacing)
Vous devez sous-classer UICollectionViewLayout
et remplacer la méthode collectionViewContentSize
. J'ai sous-classé UICollectionViewFlowLayout
pour ne pas avoir à réécrire tout le code de mise en page.
Je construis une grille 4x4, donc ma méthode ressemble à ceci:
- (CGSize)collectionViewContentSize
{
NSInteger itemCount = [self.collectionView numberOfItemsInSection:0];
NSInteger pages = ceil(itemCount / 16.0);
return CGSizeMake(320 * pages, self.collectionView.frame.size.height);
}
Remarque: lorsque vous utilisez une disposition personnalisée, vous perdez la possibilité de définir certaines des propriétés d'affichage dans Interface Builder. Vous pouvez les définir par programme dans la méthode init
de votre sous-classe UICollectionViewLayout personnalisée. Voici le mien pour référence:
- (id)init
{
self = [super init];
if (self) {
[self setup];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
[self setup];
}
return self;
}
- (void)setup
{
self.itemSize = CGSizeMake(65.0f, 65.0f);
self.minimumLineSpacing = 15;
self.sectionInset = UIEdgeInsetsMake(7.5f, 7.5f, 30.0f, 7.5f);
[self setScrollDirection:UICollectionViewScrollDirectionHorizontal];
}
Pour la pagination horizontale
if(CollectionView.pagingEnabled)
{
int numberOfPages = floor(collectionView.contentSize.width /
collectionView.frame.size.width) + 1;
CGFloat
float requierdWidth=self.collectionView.frame.size.width*numberOfPages;
self.Layout.footerReferenceSize=CGSizeMake(requierdWidth-self.collectionView.contentSize.width,0);
}
La réponse fonctionne bien, mais pour notre code, nous avions une section par page. Cela signifiait donc que le remplacement de notre classe de disposition était juste
-(CGSize) collectionViewContentSize {
return CGSizeMake(CGRectGetWidth(self.collectionView.frame) *
[self.collectionView numberOfSections],
CGRectGetHeight(self.collectionView.frame)) ;
}
J'ai une réponse qui ne nécessite aucun sous-classement.
Dans -viewDidLoad, calculez combien d'éléments par page vous aurez et combien de pages vous aurez. Stockez ces valeurs dans les propriétés.
self.numberOfItemsPerPage = NumberOfRows * NumberOfColumns;
self.numberOfPages = ceilf((CGFloat)self.items.count / (CGFloat)self.numberOfItemsPerPage);
Puis dans -collectionView: numberOfItemsInSection: mentez-y:
return self.numberOfItemsPerPage * self.numberOfPages;
Vous aurez bien sûr plus de cellules que de contenu, non? Donc, dans -collectionView: cellForItemAtIndexPath: renvoyez simplement nil pour les cellules supplémentaires:
if (indexPath.item > [self.items count] - 1) {
//We have no more items, so return nil. This is to trick it to display actual full pages.
return nil;
}
Et voilà: la dernière page pleine et déroulante. À mon avis, le mode de défilement horizontal devrait juste par défaut.
Vous pouvez ajuster le contenu avec le viewDidLayoutSubviews:
méthode. Cette méthode est appelée lorsque la vue de collection et toutes les cellules sont placées dans le view
, afin que vous puissiez ajuster la cellule.
Je pense que vous devez sous-classer UICollectionViewLayout
et créer votre mise en page personnalisée pour gérer ce genre de problèmes.