tutorial source how data collection ios objective-c uicollectionview uicollectionviewcell uicollectionviewlayout

ios - source - Agregar relleno a la primera y a la última celda de UICollectionView



uicollectionview header (2)

He subclase UICollectionViewFlowLayout para obtener UICollectionView horizontal con comportamiento similar a paginación. Funciona perfectamente bien siempre que UICollectionViewCell no sea el primero de la última celda. Imágenes adjuntas a continuación.

¿Debo anular algo en mi UICollectionViewFlowLayout además de seguir?

- (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; }

Cualquier punteros / comentarios serán útiles.


Puede configurar el espacio a la izquierda y a la derecha igual a su relleno cuando configure el marco de su vista de colección.

o

Puede poner la condición en cellForItemAtIndexPath que si es la primera celda o la última celda, entonces gestione el relleno en consecuencia. Eso es.

O

puede establecer la propiedad contentInset de su collectionView.

por ejemplo,

UICollectionView *cv; // your collectionView cv.contentInset = UIEdgeInsetsMake(0, 5, 0, 5);


simple, puede usar los métodos de collectionview para establecer UIEdgeInsets como el método de abajo.

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

aquí puede pasar el valor para el espacio del lado izquierdo y el del lado derecho para la primera y la última celda, también puede proporcionar un espacio mínimo entre dos celdas por debajo del método

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