Diseño automático: no puede get el tamaño de fotogtwig de UICollectionViewCell subViews

Tengo una subclass UICollectionViewCell personalizada ( MyCell ), su interfaz está configurada en Interface Builder usando Auto Layout. La celda tiene una vista de image y una label.

Ahora, cuando configuro la celda, necesito saber el ancho y el alto de la vista de la image. Suena bastante simple, pero parece que es imposible.

En mi vista controller:

 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath]; cell.itemNumber = indexPath.item; return cell; } 

En la subclass de mi celda estoy usando el configurador de mi propiedad para personalizar la celda:

 - (void)setItemNumber:(NSInteger)itemNumber { _itemNumber = itemNumber; self.label.text = [NSString stringWithFormat:@"%i", self.itemNumber]; // In my actual project I need to know the image view's width and hight to request an image // of the right size from a server. Sadly, the frame is always {{0, 0}, {0, 0}} // (same for the bounds) NSLog(@"%@", NSStringFromCGRect(self.myImageView.frame)); } 

Puede encontrar un proyecto de ejemplo completo en https://github.com/kevinrenskers/CollectionViewAutoLayoutTest .

El problema es así: necesito saber el tamaño de la vista de la image porque necesito pedirle a un server que genere una image del tamaño correcto. Y el tamaño de la vista de la image es {0,0} …

He intentado hacer la personalización también en el método -layoutSubviews :

 - (void)setItemNumber:(NSInteger)itemNumber { _itemNumber = itemNumber; } - (void)layoutSubviews { if (self.myImageView.frame.size.height) { self.label.text = [NSString stringWithFormat:@"%i", self.itemNumber]; NSLog(@"%@", NSStringFromCGRect(self.myImageView.frame)); } } 

Lamentablemente, esto es aún más desorderado. El método se llama dos veces, primero el cuadro es {{0, 0}, {0, 0}} y luego el cuadro se establece correctamente. Por lo tanto, la instrucción if que verifica la altura. Una vez que comienzas a desplazarte, las tags incorrectas se muestran para las celdas incorrectas. No entiendo lo que está pasando aquí.

El problema probablemente tenga más sentido cuando lo intentes en el proyecto de ejemplo .

Establecer restricciones de ancho y alto y hacer que IBOutlets suene como una gran opción, pero lamentablemente las celdas no tienen un tamaño fijo y la image necesita networkingucirse y crecer con la celda. Eliminar la distribución automática tampoco es una opción.

Al final, agregué restricciones de espacio superior, derecho, inferior e izquierdo en la vista de image (a la vista de supervisión), les añadí IBOutlets y utilicé algo como esto:

 CGFloat height = self.contentView.bounds.size.height - self.topConstraint.constant - self.bottomConstraint.constant; CGFloat width = self.contentView.bounds.size.width - self.leftConstraint.constant - self.rightConstraint.constant;