Las subvistas de celda UICollectionView no cambian de tamaño

En una vista de colección, algunas celdas deben tener una subvista o capa adicional. Se le puede decir a CollectionView que cambie el tamaño de sus celdas, por lo que todo el contenido debe redimensionarse adecuadamente.

Actualmente, la célula se inicializa desde un plumín que contiene una celda con una vista de imagen; la plumilla de celda está vinculada a una subclase UICollectionViewCell personalizada, que solo hace el init. Autoresize subviews está marcada.

Se le dice a CollectionView que cambie el tamaño de la celda por un valor derivado y devuelto en “sizeForItemAtIndexPath:”. He subclasificado un FlowLayout pero solo especifica ScrollDirection y Insets.

Todo eso está funcionando bien. Problema: ¿Cómo agrego una subvista / capa a la celda para que también cambie el tamaño correctamente? Traté de agregar subvistas y capas con traduceAutlasizingMaskIntoConstraints off, pero estas no cambian el tamaño automáticamente. También intenté usar el marco / vista de código en lugar de la punta.

Lo mejor que tengo ahora es una subcapa cell.contentView.layer que agrego en cellForItemAtIndexPath :; eso es “manualmente” redimensionado al almacenar frame.size de la celda de sizeForItemAtIndexPath :, que no solo es feo sino que también termina con la subcapa que tiene varios tamaños para diferentes celdas.

Cualquier ayuda apreciada!

Me encontré con el mismo problema en este momento.

Al usar el método UICollectionViewFlowLayoutDelegate para establecer el tamaño de la celda según el dispositivo y la orientación del dispositivo, el tamaño se calcularía correctamente, pero las subvistas no cambiarían el tamaño para llenar la celda de nuevo tamaño. El efecto fue una gran celda en blanco con pequeñas subvistas que no llenan los límites de la celda / permanecen el tamaño igual a su valor actual en el archivo xib.

Lo resolví haciendo lo siguiente en awakeFromNib :

 - (void)awakeFromNib { [super awakeFromNib]; self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; self.contentView.translatesAutoresizingMaskIntoConstraints = YES; } 

Antes de hacer esto, la máscara contentView era nil .

 *override func awakeFromNib() { super.awakeFromNib() self.contentView.autoresizingMask.insert(.FlexibleHeight) self.contentView.autoresizingMask.insert(.FlexibleWidth) } 

Esto funcionó para mí. Este código va dentro de su archivo UICollectionViewCell.swift subclasificado (donde se encuentra el código que involucra la celda personalizada)

Solución Swift *

Como alternativa a habilitar AutoResizingMask, para UICollectionViewLayouts personalizados que tienen altura variable, por ejemplo, donde está configurando algunas restricciones manualmente y necesita traducirAutorsizingMaskIntoConstraints para permanecer como NO, puede agregar lo siguiente a layoutSubviews en la celda:

 self.contentView.frame = self.bounds; 

Esto funcionó para arreglar todos mis diseños de vista de colección personalizados que tenían problemas con Xcode 6.

En otro proyecto sin xibs, subcultivé UICollectionViewCell y lo hice para el mismo efecto:

 #import "CVcell.h" @implementation CVcell @synthesize cellImage; - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { CGFloat cellSize = self.contentView.bounds.size.width; cellImage = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, cellSize, cellSize)]; [cellImage setClipsToBounds:YES]; cellImage.translatesAutoresizingMaskIntoConstraints = NO; cellImage.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; [self.contentView addSubview:cellImage]; } return self; } @end 

Siempre prefiero el autodesplazamiento cuando sea posible. Pero a veces usar marcos y límites es un ahorro de tiempo cuando una vista se determina directamente solo por su supervista.

En el caso de UICollectionViewCell establezco una imagen para que sea el marco de las celdas + self.imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; self.imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

Pero cuando tenía diferentes tamaños de celdas en la colección, verlo estropeaba las cosas y la imagen a veces tomaba el tamaño de una celda diferente.

Así que me puse a trabajar con los límites de las celdas y … bueno, eso funcionó bien.

Entonces tal vez intentarlo?

Una solución de diseño automático simple es establecer restricciones a la vista de contenedor.

Por lo tanto, si tenemos una vista de imagen con una vista principal, básicamente queremos decirle a la subvista (la vista de la imagen) que mantenga una distancia de espacio inicial, final, inferior y superior de 0 a la vista de contenedor.

Restricciones de diseño automático para cambiar el tamaño con la vista principal

La solución @Alfie Hanssen ( aquí ) no funcionó correctamente para mí, de acuerdo con este artículo :

El tamaño de la vista de celda en XIB es 50 x 50 puntos, que es el tamaño predeterminado de las celdas de vista de colección como se establece en el diseño de flujo. Incluso si es un poco difícil trabajar con una célula tan pequeña en Interface Builder, es mejor no cambiar el tamaño predeterminado. El problema es que Diseño automático considera que el tamaño del conjunto manual es fijo y genera un error NSAutoresizingMaskLayoutConstraint cuando intenta ajustar la altura de las celdas automáticamente.

He inspeccionado el UICollectionViewCell y encontré que hay una vista entre la celda y el contentView, y esa vista tiene restricciones intrínsecas de ancho y alto. En lugar de AutoresizingMask, estoy actualizando como a continuación y parece funcionar para mí.

 override func layoutSubviews() { contentView.superview?.frame = bounds super.layoutSubviews() } 

La solución fue desactivar AutoConstraints para el xib de la celda y activar las flechas flexibles de ancho / altura en el AutoResize para las imágenes.

Yo tuve el mismo problema. El cambio entre dos diseños no redimensionó las Imágenes (UIImage) dentro de mis celdas. Mis celdas donde construir sin un xib. Y utilicé dos clases de celda diferentes para cada CollectionViewCustomLayout.

Lo arreglé esto programáticamente con esto:

  self.autoresizesSubviews = YES; 

en mis subclases UICollectionViewCell.

Pero esto solo funcionó para mí al agregar la imagen como una imagen de fondo de celdas como esta:

 cell.backgroundView[[UIImageView alloc] initWithImage: SumDummyImage ]; 

Estoy agregando subView y restricción mediante progtwigción, el siguiente código funciona para mí:

 lazy var imageView: UIImageView = { [unowned self] in let imageView = UIImageView(frame: self.contentView.frame) imageView.contentMode = .scaleAspectFill imageView.clipsToBounds = true return imageView }() func updateCellWith(image: UIImage) { contentView.subviews.forEach { $0.removeFromSuperview() } contentView.addSubview(imageView) imageView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0).isActive = true imageView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 0).isActive = true imageView.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: 0).isActive = true imageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0).isActive = true self.imageView.autoresizingMask.insert(.flexibleHeight) self.imageView.autoresizingMask.insert(.flexibleWidth) imageView.image = image } 
    Intereting Posts