4

J'ai sous-classé UICollectionViewFlowLayout pour obtenir le comportement horizontal de UICollectionView avec pagination. Cela fonctionne parfaitement bien tant que UICollectionViewCell n'est pas le premier de la dernière cellule. Images ci-dessous.Ajout de remplissage à la première et à la dernière cellule de UICollectionView

enter image description here enter image description here

Ai-je besoin de passer outre quelque chose dans mon UICollectionViewFlowLayout tout en suivant?

- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity 
{ 
CGFloat offSetAdjustment = MAXFLOAT; 
CGFloat horizontalCenter = (CGFloat) (proposedContentOffset.x + (self.collectionView.bounds.size.width/2.0)); 

CGRect targetRect = CGRectMake(proposedContentOffset.x, 
           0.0, 
           self.collectionView.bounds.size.width, 
           self.collectionView.bounds.size.height); 

NSArray *array = [self layoutAttributesForElementsInRect:targetRect]; 
for (UICollectionViewLayoutAttributes *layoutAttributes in array) 
{ 
    if(layoutAttributes.representedElementCategory == UICollectionElementCategoryCell) 
    { 
     CGFloat itemHorizontalCenter = layoutAttributes.center.x; 
     if (ABS(itemHorizontalCenter - horizontalCenter) < ABS(offSetAdjustment)) 
     { 
      offSetAdjustment = itemHorizontalCenter - horizontalCenter; 
     } 
    } 
} 

CGFloat nextOffset = proposedContentOffset.x + offSetAdjustment; 

do { 
    proposedContentOffset.x = nextOffset; 
    CGFloat deltaX = proposedContentOffset.x - self.collectionView.contentOffset.x; 
    CGFloat velX = velocity.x; 

    if(deltaX == 0.0 || velX == 0 || (velX > 0.0 && deltaX > 0.0) || (velX < 0.0 && deltaX < 0.0)) 
    { 
     break; 
    } 

    if(velocity.x > 0.0) 
    { 
     nextOffset += [self snapStep]; 
    } 
    else if(velocity.x < 0.0) 
    { 
     nextOffset -= [self snapStep]; 
    } 
} while ([self isValidOffset:nextOffset]); 

proposedContentOffset.y = 0.0; 

return proposedContentOffset; 
} 
    - (BOOL)isValidOffset:(CGFloat)offset 
{ 
    return (offset >= [self minContentOffset] && offset <= [self maxContentOffset]); 
} 

- (CGFloat)minContentOffset 
{ 
    return -self.collectionView.contentInset.left; 
} 

- (CGFloat)maxContentOffset 
{ 
    return [self minContentOffset] + self.collectionView.contentSize.width -  self.itemSize.width; 
} 

- (CGFloat)snapStep 
{ 
return self.itemSize.width + self.minimumLineSpacing; 
} 

Des pointeurs/commentaires seront utiles.

+0

vous pouvez utiliser 'UIEdgeInsets La propriété sectionInset' de 'UICollectionViewFlowLayout'. Reportez-vous à ce [post] (http://stackoverflow.com/questions/16934831/placing-a-margin-around-each-edge-of-the-uicollectionview). Reportez-vous également à la documentation Apple sur [Utilisation de l'encadré] (https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/UsingtheFlowLayout/UsingtheFlowLayout.html) –

Répondre

14

Vous pouvez définir un espace à gauche et à droite égal à votre remplissage lors de la définition du cadre de votre vue de collection.

ou

Vous pouvez mettre en état cellForItemAtIndexPath que si elle est première cellule ou la dernière cellule puis gérer un rembourrage en conséquence. c'est tout.

Ou

vous pouvez définir contentInset propriété de votre CollectionView.

par exemple,

UICollectionView *cv; // your collectionView 

cv.contentInset = UIEdgeInsetsMake(0, 5, 0, 5); 
+0

argh 30 min n'ont jamais pensé à mettre en place UICollectionView lui-même. – slonkar

+0

oui, la définition de contentInset est une bonne solution pour votre cas. :) – Lion

+0

merci, cette réponse m'a beaucoup aidé –

1

simple, vous pouvez utiliser des méthodes pour définir UIEdgeInsets main collection comme méthode ci-dessous.

-(UIEdgeInsets)collectionView:(UICollectionView*)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section 
{ 
    return UIEdgeInsetsMake(0,10,0,10); // top, left, bottom, right 
} 

ici, vous pouvez passer la valeur de l'espace côté gauche et l'espace côté droit pour la première et dernière cellule, vous pouvez également fournir un espace minimum entre deux cellules par la méthode ci-dessous

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section { 
    return 5.0; 
} 
+0

Je suis déjà en train de mettre en incrustation lorsque je crée une instance de UICollectionViewFlowLayout. Donc, cela n'aide pas et minimumInteritemSpacing n'est pas utile ici parce que je fais un scroll horizontal. Vous devez utiliser ici minimumLineSpacing que je suis déjà en train de faire. – slonkar