Подтвердить что ты не робот

Оценка UICollectionViewItemSize - последняя ячейка не выровнена

Я хочу сделать обычную горизонтальную прокрутку flowLayout UICollectionView с оценкойItemSize и preferredLayoutAttributesFittingAttributes в ячейке. Но с последней ячейкой что-то не так. Любая идея, где проблема? Сам проект

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    
4b9b3361

Ответ 1

Вы устанавливаете параметр valuItemSize в самом начале представления.

Вам нужно установить его на каком-то контроллере.

Кроме того,

Если все ваши ячейки имеют одинаковую высоту, используйте свойство itemSize вместо этого свойства, чтобы указать размер ячейки.

Документация: estimatedItemSize

Ответ 2

существует простой способ его устранения. Вы можете добавить количество прототипов для проверки ячейки в нужном месте. Как только вы обнаружите проблему в последней ячейке. Проверьте ячейки в окне Inspector.

Ответ 3

Вы вызываете метод super, но вы не использовали супер возвращенные атрибуты layoutAttributes.

    [super preferredLayoutAttributesFittingAttributes:layoutAttributes];

Вы можете попробовать распечатать оригинальные атрибуты layoutAttributes vs super layoutAttributes. Иногда вам не нужно называть суперфункцию.

Во-вторых, вы можете создать пользовательский flowlayout или установить вставку, чтобы ваша ячейка совпадала с вершиной. Я сделал это в своем проекте.

Ответ 4

Вы можете рассматривать это предложение. По моему мнению, высота UICollectionView больше, чем UICollectionViewCell Height, вот почему это происходит. пожалуйста, сделайте их равными им.

Ответ 5

Пользовательский размер ячейки должен быть таким же, как у ячейки коллекции, проверьте это. Это может решить проблему для вас.

Ответ 6

Я сделал аналогичный небольшой проект (один вид горизонтальной коллекции (1 * N)), вот github. Я надеюсь, что это будет полезно для вашего требования.

https://github.com/texas16/HorizontalCollectionView