with uicollectionviewflowlayoutautomaticsize automatic ios uicollectionview autolayout uicollectionviewcell

ios - uicollectionviewflowlayoutautomaticsize - uicollectionviewcell size



Diseño automático en UICollectionViewCell no funciona (4)

Bueno, solo miré en los foros de desarrolladores de iOS. Aparentemente, se trata de un error con el iOS 8 SDK que se ejecuta en dispositivos con iOS 7. La solución consiste en agregar lo siguiente a su subclase de UICollectionViewCell:

- (void)setBounds:(CGRect)bounds { [super setBounds:bounds]; self.contentView.frame = bounds; }

Tengo un UICollectionView simple con celdas que tienen un solo UITextView. El UITextView está restringido a los bordes de la celda, por lo que debe permanecer del mismo tamaño que el tamaño de la celda.

El problema que tengo es que, por alguna razón, estas restricciones no funcionan cuando especifico el tamaño de la celda a través de collectionView: layout: sizeForItemAtIndexPath :.

Tengo el tamaño de la celda establecido en 320x50 en el guión gráfico. Si devuelvo un tamaño con 2 veces la altura del tamaño de celda con sizeForItemAtIndexPath :, la UITextView permanece la misma altura a pesar de las restricciones que establecí. Estoy usando Xcode 6 GM.

Mi código de controlador de vista es:

@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

Esos registros en viewDidAppear: dame una salida de:
100.00000
50.00000
Como puede ver, la altura UITextView no cambia con la altura de la celda.


Aquí hay una captura de pantalla del guión gráfico que configuré con una UITextView restringida en UICollectionViewCell:

Sé que el uso de restricciones de diseño automático funciona bien con UITableViewCells y el cambio de tamaño dinámico. No tengo idea de por qué no funciona en este caso. ¿Alguien tiene alguna idea?


Código Swift equivalente:

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


Swift 2.0:

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


Aquí está la solución, si no está subclasificando UICollectionViewCell . Simplemente agregue estas dos líneas en su cellForItemAtIndexPath: after 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]