UICollectionView estimatedItemSize - 最后一个单元格未对齐

时间:2014-10-25 20:26:34

标签: ios objective-c uicollectionview uicollectionviewcell

我想在单元格中使用estimatedItemSize和preferredLayoutAttributesFittingAttributes制作一个通常的horizo​​ntalScrolling flowLayout UICollectionView。但最后一个细胞有问题。知道问题出在哪里? Project itself

enter image description here

@implementation RowCollectionView

- (instancetype) initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout
{
    if (self = [super initWithFrame:frame collectionViewLayout:layout])
    {
        [self configureRowCollectionView];
    }

    return self;
}

- (void) awakeFromNib
{
    [super awakeFromNib];

    [self configureRowCollectionView];
}

- (void) configureRowCollectionView
{
    self.backgroundColor = [UIColor lightGrayColor];

    self.dataSource = self;
    self.delegate = self;

    // Horizontal Direction
    UICollectionViewFlowLayout *flowLayout = (UICollectionViewFlowLayout *) self.collectionViewLayout;
    flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal;

    // Estimated Item Size
    flowLayout.estimatedItemSize = CGSizeMake(self.bounds.size.height, self.bounds.size.height);


    [self registerClass:[RowCollectionViewCell class] forCellWithReuseIdentifier:NSStringFromClass([RowCollectionViewCell class])];
}

- (NSInteger) collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return 10;
}

- (UICollectionViewCell *) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([RowCollectionViewCell class]) forIndexPath:indexPath];

    cell.contentView.backgroundColor = [UIColor redColor];

    return cell;
}

@end

@implementation RowCollectionViewCell

- (UICollectionViewLayoutAttributes *) preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes
{
    [super preferredLayoutAttributesFittingAttributes:layoutAttributes];

    UICollectionViewLayoutAttributes *attributes = [layoutAttributes copy];

    attributes.size = CGSizeMake(80, 80);

    return attributes;
}

@end    

8 个答案:

答案 0 :(得分:1)

您正在视图初始化中设置estimatedItemSize。

您需要在某个控制器中进行设置。

另外,

  

如果所有单元格的高度相同,请使用itemSize属性而不是此属性来指定单元格大小。

文档:estimatedItemSize

答案 1 :(得分:1)

有一种简单的方法可以解决这个问题。您可以添加多个原型单元格以检查所需位置的单元格。一旦在最后一个单元格中找到问题。检查“检查器”窗口中的单元格插图。

答案 2 :(得分:1)

你调用super方法,但你没有使用super返回的layoutAttributes。

    [super preferredLayoutAttributesFittingAttributes:layoutAttributes];

您可以尝试打印原始layoutAttributes和super的layoutAttributes。 有时候,你不需要调用超级功能。

其次,您可以创建自定义flowlayout或设置插入以让您的单元格对齐顶部。我在我的项目中做到了这一点。

答案 3 :(得分:1)

我遇到了类似的问题,并且使用UICollectionViewDelegateFlowLayout的委托方法-minimumInteritemSpacingForSectionAt-提供了适当的最小项间间距,从而解决了该问题。

答案 4 :(得分:0)

您可以将其视为建议。据我所知UICollectionView的高度超过UICollectionViewCell高度,这就是它发生的原因。请让他们平等他们

答案 5 :(得分:0)

自定义单元格大小必须与集合视图单元格大小相同,请检查。它可以为您解决问题。

答案 6 :(得分:0)

我做了类似的小项目(一个原始(1 * N)水平集合视图),这里是github。我希望这对你的要求有所帮助。

https://github.com/texas16/HorizontalCollectionView

答案 7 :(得分:-1)

有同样的问题,在我的情况下修复它是为了确保:

  1. 所有单元格高度相等。

  2. collectionView高度大于单元格高度+单元格之间的空间。