¿Por qué se cambia el tamaño de UIImageView al asignar una nueva image en iOS 6?

Una aplicación contiene una UITableView que contiene una ITUableViewCell personalizada. La celda a su vez contiene una UIImageView.

El problema es que la configuration de la image en cellForRowAtIndexPath hace que la image ocupe todo el área UITableViewCell:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { CustomCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"CustomCell"]; NSString *path = [[NSBundle mainBundle] pathForResource:@"bigrect" ofType:@"png"]; UIImage *image = [[UIImage alloc] initWithContentsOfFile:path]; cell.imageView.image = image; return cell; } 

introduzca la descripción de la imagen aquí

En IB, 'Aspect Fit' ha sido seleccionado como el modo, pero cambiar este campo no tiene ningún efecto aparente en el resultado.

Sin embargo, cuando la image se establece desde IB, sin llamada a cell.imageView.image = image en mi código, el resultado es exactamente lo que me gustaría ver. La image se mantiene dentro de los límites que he definido para el UIImageView en IB y no intenta escalar para ajustarse a la altura vertical completa de UITableViewCell:

introduzca la descripción de la imagen aquí

La image que estoy usando es de 1307×309 píxeles, en caso de que eso sea importante. Las testings se ejecutaron en el simulador iOS 6.1.

Lo noté en la Documentación de UIIMageView :

En iOS 6 y posterior, si asigna un valor a la propiedad restrationIdentifier de esta vista, intenta conservar el marco de la image mostrada. Específicamente, la class conserva los valores de los límites, el centro y las properties de transformación de la vista y la propiedad anchorPoint de la capa subyacente. Durante la restauración, la vista de image restaura estos valores para que la image aparezca exactamente como antes. Para get más información acerca de cómo funciona la conservación y restauración del estado, consulte la Guía de progtwigción de aplicaciones de iOS.

Sin embargo, nada aquí o en otro lugar en la documentation que pude encontrar resolvió el problema. Agregar un "ID de restauración" de "Foo" a UIImageView en IB en "Identidad" no cambió el comportamiento. Deseleccionar 'Usar Autolayout' tampoco modificó el comportamiento.

¿Cómo puedo evitar que iOS cambie el tamaño del UIImageView en una UITableViewCell al configurar la image?

Resulta que UITableViewCell aparentemente ya tiene una propiedad llamada "imageView" que cubre todo el background de la celda. Establecer la propiedad de image de este object imageView establece la image de background , no la image en la que estaba interesado.

Al cambiar mi método a lo siguiente asegurando que CustomCell tiene una propiedad "myImageView" solucionó el problema:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { CustomCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"CustomCell"]; NSString *path = [[NSBundle mainBundle] pathForResource:@"bigrect" ofType:@"png"]; UIImage *image = [[UIImage alloc] initWithContentsOfFile:path]; cell.myImageView.image = image; return cell; } 

Esta respuesta SO a una pregunta ligeramente diferente me indicó la dirección correcta.