Ich habe UICollectionViewFlowLayout subclassed, um horizontale UICollectionView mit paging-ähnlichen Verhalten zu erhalten. Es funktioniert einwandfrei, solange UICollectionViewCell nicht die erste der letzten Zelle ist. Bilder unten angehängt.Hinzufügen von Padding zur ersten und letzten Zelle von UICollectionView
Muss ich etwas in meinem UICollectionViewFlowLayout neben folgenden außer Kraft setzen müssen?
- (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;
}
Alle Hinweise/Kommentare werden nützlich sein.
können Sie 'UIEdgeInsets verwenden sectionInset' -Eigenschaft von 'UICollectionViewFlowLayout'. Verweisen Sie auf diese [post] (http://stackoverflow.com/questions/16934831/placing-a-margin-around-e-ed-ed-the-uicollectionview). Weitere Informationen finden Sie in der Apple-Dokumentation unter [Verwenden des Abschnittseinschubs] (https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/UsingtheFlowLayout/UsingtheFlowLayout.html) –