web-dev-qa-db-fra.com

Comment étendre UICollectionView contentSize lorsque la pagination est activée?

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)

27
LE SANG

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];
}
35
reallyseth

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);
}
2
user2501116

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)) ;
}
1
christophercotton

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.

0
Paul Bruneau

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.

0
Swapnil

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.

0
Andrea Mario Lufino