web-dev-qa-db-fra.com

UICollectionView installedItemSize - la dernière cellule n'est pas alignée

Je souhaite créer un UICollectionView horizontalScrolling flowLayout habituel avec a estiméItemSize et preferredLayoutAttributesFittingAttributes dans une cellule. Mais il y a quelque chose qui ne va pas avec la dernière cellule. Toute idée où est le problème? Projet lui-même

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    
31
artysx

il existe une méthode simple pour résoudre ce problème. Vous pouvez ajouter un nombre de cellules prototypes pour vérifier la cellule à la position requise. Une fois que vous avez trouvé le problème dans la dernière cellule. Vérifiez les encarts de cellule dans la fenêtre Inspecteur. 

1
Abhi

Vous appelez la méthode super, mais vous n'avez pas utilisé layoutAttributes retourné.

    [super preferredLayoutAttributesFittingAttributes:layoutAttributes];

Vous pouvez essayer d'imprimer layoutAttributes d'origine contre les layoutAttributes ..__ de super .. Parfois, vous n'avez pas besoin d'appeler la fonction super.

Deuxièmement, vous pouvez créer un flowlayout personnalisé ou définir un encadré pour que votre cellule s'aligne en haut. Je l'ai fait dans mon projet.

1
Yang Young

Je suis confronté à un problème similaire. Le problème a été résolu en définissant un espacement minimal approprié entre les éléments, à l'aide des méthodes de délégation - minimumInteritemSpacingForSectionAt - de UICollectionViewDelegateFlowLayout. 

1
Romit Kumar

Vous définissez EstimatedItemSize dans l'init de la vue elle-même. 

Vous devez le configurer dans un contrôleur.

Également, 

Si toutes vos cellules ont la même hauteur, utilisez la propriété itemSize au lieu de cette propriété pour spécifier la taille de la cellule.

Documentation: EstimatedItemSize

1
neelamc23

J'ai réalisé un petit projet similaire (une vue de collection horizontale brute (1 * N)), voici le github J'espère que cela vous sera utile.

https://github.com/texas16/HorizontalCollectionView

0
casillas

La taille de cellule personnalisée doit être identique à celle de la cellule de la vue de collection. Veuillez vérifier cela. Cela peut résoudre le problème pour vous. 

0
iOSBeginner

Vous pouvez considérer cela comme une suggestion. Selon moi, la hauteur de UICollectionView est supérieure à UICollectionViewCell Height, c'est pourquoi cela arrive. s'il vous plaît faites les égaler

0
ajjjjjjjj