Las subvenciones de la celda UICollectionView no cambian de tamaño.

En un CollectionView, algunas celdas deberían tener una subvista o capa adicional. A CollectionView se le puede pedir que networkingimensione sus celdas, por lo que todo el contenido necesita cambiar el tamaño de manera adecuada.

Actualmente, la celda se inicializa desde una punta que contiene una celda con imageview; la plumilla de celda está vinculada a una subclass UICollectionViewCell personalizada, que solo hace el init. Autoresize subviews está marcado.

Se le pide a CollectionView cambiar 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 subview / layer a la celda para que también cambie el tamaño correctamente? Intenté agregar subtítulos y capas con translateAutoresizingMaskIntoConstraints, pero estos no cambian automáticamente el tamaño en absoluto. También trató de usar marco / vista de código en lugar de plumilla.

Lo mejor que tengo ahora es una subcapa cell.contentView.layer que agrego en cellForItemAtIndexPath :; que se networkingimensiona "manualmente" almacenando el frame.ize de la celda desde 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 ahora mismo.

Cuando se usa el método UICollectionViewFlowLayoutDelegate para establecer el tamaño de celda según el dispositivo y la orientación del dispositivo, el tamaño se calculará correctamente, pero las subidas no cambiarán de 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 / siguen siendo el tamaño igual a su valor actual en el file xib.

awakeFromNib esto 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 se incluye en el file subclass UICollectionViewCell.swift (donde se encuentra el código que implica la celda personalizada)

Solución rápida *

Como una alternativa para habilitar AutoResizingMask, para UICollectionViewLayouts personalizados que tienen altura de variable, por ejemplo, donde está configurando algunas restricciones de forma manual y necesita traducir TradesAuthorizingMaskIntoConstraints para que sigan NO, puede agregar lo siguiente a layoutSubviews en la celda:

 self.contentView.frame = self.bounds; 

Esto funcionó para arreglar todos los layouts de vista de colección personalizados que tenían problemas con Xcode 6.

En otro proyecto sin xibs subclasé UICollectionViewCell e hice esto 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 la reproducción automática cuando es posible. Pero a veces los frameworks y los límites de uso solo son ahorros de time cuando una vista se determina directamente solo por su supervisión.

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

Pero cuando tenía diferentes tamaños de celdas en la colección, vi cosas desorderadas y la image a veces tomaba el tamaño de una celda diferente.

Así que me puse a trabajar con los límites de las celdas y … ustedes que realmente funcionaron bien.

Entonces, ¿podrías probarlo?

Una solución de layout automático simple es establecer restricciones en la vista del contenedor.

Entonces, si tenemos una vista de image con una vista principal, básicamente queremos decirle a la subvista (la vista de la image) que mantenga una distancia de espacio superior, posterior, inferior y superior de 0 a la vista de contenedor.

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

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

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

He inspeccionado UICollectionViewCell y descubrí que hay una vista entre la celda y el contenido de la vista, y esa vista tiene restricciones intrínsecas de ancho y alto. En lugar de AutoresizingMask, estoy actualizando como abajo y parece funcionar para mí.

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

La solución fue desactivar AutoConstraints para la celda xib y activar las flechas flexibles de ancho / alto en el AutoResize para las vistas de la image.

Yo tuve el mismo problema. Cambiar entre dos layouts no cambió el tamaño de las imágenes (UIImage) dentro de mis celdas. Mis celdas donde build sin un xib. Y utilicé dos classs de celdas diferentes para cada CollectionViewCustomLayout.

Reparé esto programáticamente con esto:

  self.autoresizesSubviews = YES; 

en mis subclasss UICollectionViewCell.

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

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

Estoy agregando subView y restricción programáticamente, 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 }