将填充添加到UICollectionView的第一个和最后一个单元格

slo*_*kar 13 objective-c ios uicollectionview uicollectionviewcell uicollectionviewlayout

我已经将UICollectionViewFlowLayout子类化为获取具有分页行为的水平UICollectionView.只要UICollectionViewCell不是最后一个单元格的第一个,它就可以正常工作.下面附有图片.

在此输入图像描述 在此输入图像描述

除了以下后,我是否需要在UICollectionViewFlowLayout中覆盖某些内容?

- (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;
}
Run Code Online (Sandbox Code Playgroud)

任何指针/注释都会很有用.

Lio*_*ion 29

在设置集合视图的框架时,可以将左侧和右侧的空间设置为等于填充.

要么

cellForItemAtIndexPath如果是第一个单元格或最后一个单元格,则可以将条件置于其中,然后相应地管理填充.而已.

要么

您可以设置contentInsetcollectionView的属性.

例如,

UICollectionView *cv; // your collectionView

cv.contentInset = UIEdgeInsetsMake(0, 5, 0, 5);
Run Code Online (Sandbox Code Playgroud)


Jon*_*era 5

您可以通过在Interface Builder中更改插图来实现。它们可以在“ 大小”检查器中作为“ 部分插图”找到:

InterfaceBuilder中集合视图的部分插图


Tun*_*Fam 5

接受的解决方案有效,但如果您有 pagingEnabled,则集合视图分页会被破坏

对我来说,解决方案是使用:


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    return UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 16)
}

Run Code Online (Sandbox Code Playgroud)