La question fondamentale est la Disposition de Flux n'est pas conçu pour soutenir la pagination. Pour atteindre la pagination effet, vous aurez à sacrifier l'espace entre les cellules. Et bien calculer les cellules image et en faire peut-être divisé par l'affichage de la collection frame sans restes. Je vais vous expliquer la raison.
Dire la disposition suivante est ce que tu voulais.
Avis, le plus de marge de gauche (vert) ne fait pas partie de l'espacement entre les cellules. Il est déterminé par le flux de la section mise en médaillon. Depuis la disposition de flux ne prend pas en charge hétérogène valeur d'espacement. Ce n'est pas une tâche triviale.
Par conséquent, après le réglage de l'espacement et l'encart. La disposition suivante est ce que vous obtiendrez.
Après faites défiler jusqu'à la page suivante. Vos cellules sont évidemment pas alignés, comme ce que vous attendiez.
Faire de l'espacement entre les cellules 0 peut résoudre ce problème. Cependant, il limite votre conception si vous voulez la marge supplémentaire sur la page, surtout si la marge est différent de l'espacement entre les cellules. Il exige également le point de vue image doit être divisible par la cellule de trame. Parfois, c'est une douleur si votre point de vue image n'est pas fixe (en tenant compte de la rotation des cas).
La véritable solution est de la sous-classe UICollectionViewFlowLayout et de redéfinir des méthodes suivantes
- (CGSize)collectionViewContentSize
{
// Only support single section for now.
// Only support Horizontal scroll
NSUInteger count = [self.collectionView.dataSource collectionView:self.collectionView
numberOfItemsInSection:0];
CGSize canvasSize = self.collectionView.frame.size;
CGSize contentSize = canvasSize;
if (self.scrollDirection == UICollectionViewScrollDirectionHorizontal)
{
NSUInteger rowCount = (canvasSize.height - self.itemSize.height) / (self.itemSize.height + self.minimumInteritemSpacing) + 1;
NSUInteger columnCount = (canvasSize.width - self.itemSize.width) / (self.itemSize.width + self.minimumLineSpacing) + 1;
NSUInteger page = ceilf((CGFloat)count / (CGFloat)(rowCount * columnCount));
contentSize.width = page * canvasSize.width;
}
return contentSize;
}
- (CGRect)frameForItemAtIndexPath:(NSIndexPath *)indexPath
{
CGSize canvasSize = self.collectionView.frame.size;
NSUInteger rowCount = (canvasSize.height - self.itemSize.height) / (self.itemSize.height + self.minimumInteritemSpacing) + 1;
NSUInteger columnCount = (canvasSize.width - self.itemSize.width) / (self.itemSize.width + self.minimumLineSpacing) + 1;
CGFloat pageMarginX = (canvasSize.width - columnCount * self.itemSize.width - (columnCount > 1 ? (columnCount - 1) * self.minimumLineSpacing : 0)) / 2.0f;
CGFloat pageMarginY = (canvasSize.height - rowCount * self.itemSize.height - (rowCount > 1 ? (rowCount - 1) * self.minimumInteritemSpacing : 0)) / 2.0f;
NSUInteger page = indexPath.row / (rowCount * columnCount);
NSUInteger remainder = indexPath.row - page * (rowCount * columnCount);
NSUInteger row = remainder / columnCount;
NSUInteger column = remainder - row * columnCount;
CGRect cellFrame = CGRectZero;
cellFrame.origin.x = pageMarginX + column * (self.itemSize.width + self.minimumLineSpacing);
cellFrame.origin.y = pageMarginY + row * (self.itemSize.height + self.minimumInteritemSpacing);
cellFrame.size.width = self.itemSize.width;
cellFrame.size.height = self.itemSize.height;
if (self.scrollDirection == UICollectionViewScrollDirectionHorizontal)
{
cellFrame.origin.x += page * canvasSize.width;
}
return cellFrame;
}
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewLayoutAttributes * attr = [super layoutAttributesForItemAtIndexPath:indexPath];
attr.frame = [self frameForItemAtIndexPath:indexPath];
return attr;
}
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
NSUInteger count = [self.collectionView.dataSource collectionView:self.collectionView
numberOfItemsInSection:0];
NSMutableArray * attrs = [NSMutableArray array];
for (NSUInteger idx = 0; idx < count; ++idx)
{
UICollectionViewLayoutAttributes * attr = nil;
NSIndexPath * idxPath = [NSIndexPath indexPathForRow:idx inSection:0];
CGRect itemFrame = [self frameForItemAtIndexPath:idxPath];
if (CGRectIntersectsRect(itemFrame, rect))
{
attr = [self layoutAttributesForItemAtIndexPath:idxPath];
[attrs addObject:attr];
}
}
return attrs;
}
Avis, extrait de code ci-dessus ne prend en charge une section de défilement horizontale et la direction. Mais il n'est pas difficile à développer.
Aussi, si vous n'avez pas des millions de cellules. La mise en cache de ces UICollectionViewLayoutAttributes peut être une bonne idée.