web-dev-qa-db-fra.com

La mise en page automatique dans UICollectionViewCell ne fonctionne pas

J'ai un simple UICollectionView avec des cellules qui ont un seul UITextView. UITextView est limité aux bords de la cellule, ils doivent donc conserver la même taille que la taille de la cellule.

Le problème que je rencontre est que, pour une raison quelconque, ces contraintes ne fonctionnent pas lorsque je spécifie la taille de la cellule via collectionView: layout: sizeForItemAtIndexPath :.

J'ai la taille de la cellule définie à 320x50 dans le Storyboard. Si je retourne une taille avec 2 fois la hauteur de la taille de la cellule avec sizeForItemAtIndexPath :, UITextView reste à la même hauteur malgré les contraintes que j'ai définies. J'utilise Xcode 6 GM.

Mon code de contrôleur de vue est:

@implementation TestViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.collectionView.delegate = self;
    self.collectionView.dataSource = self;
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    UICollectionViewCell *c = [self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];

    NSLog(@"%f", c.frame.size.height);

    UITextView *tv = (UITextView *)[c viewWithTag:9];
    NSLog(@"%f", tv.frame.size.height);

}

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

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];

    return cell;
}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewFlowLayout *flowLayout = (UICollectionViewFlowLayout *)collectionView.collectionViewLayout;

    CGSize size = flowLayout.itemSize;

    size.height = size.height * 2;

    return size;
}

@end

Ces journaux dans viewDidAppear: me donnent une sortie de:
100.00000
50.00000
Comme vous pouvez le constater, la hauteur UITextView ne change pas avec la hauteur de la cellule.


Voici une capture d'écran du scénario que j'ai configurée avec une UITextView contrainte dans UICollectionViewCell:

enter image description here

Je sais que l'utilisation de contraintes de mise en page automatique fonctionne bien avec UITableViewCells et le redimensionnement dynamique. Je ne sais pas pourquoi cela ne fonctionne pas dans ce cas. Quelqu'un a-t-il une idée?

50
ryanthon

Eh bien, je viens de regarder sur les forums de développeurs iOS. Apparemment, il s’agit d’un bogue lié au SDK iOS 8 fonctionnant sur des appareils iOS 7. La solution consiste à ajouter les éléments suivants à votre sous-classe de UICollectionViewCell:

- (void)setBounds:(CGRect)bounds {
    [super setBounds:bounds];
    self.contentView.frame = bounds;
}
override var bounds: CGRect {
    didSet {
      contentView.frame = bounds
    }
}
109
ryanthon

Équivalent Swift Code:

override var bounds: CGRect {
    didSet {
      contentView.frame = bounds
    }
}
40
Hamza

Voici la solution, si vous ne sous-classez pas UICollectionViewCell. Ajoutez simplement ces deux lignes sous votre cellForItemAtIndexPath: après dequeueReusableCellWithReuseIdentifier:

Obj-C

[[cell contentView] setFrame:[cell bounds]];
[[cell contentView] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];

Swift - 2.0

cell.contentView.frame = cell.bounds
cell.contentView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
24
itsji10dra

Swift 2.0:

cell.contentView.frame = cell.bounds
cell.contentView.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
3
Bill Chan