UIImageView en mi UITableViewCell cambia el tamaño onclick

Tengo una UITableView bastante vaga en mi aplicación que se utiliza para mostrar una image y un text de forma pnetworkingeterminada / estándar. La primera vez que se solicita una UITableViewCell, la devuelvo con una image de marcador de position y comienzo una descarga asíncrona de la image real. Cuando se completa la descarga, reemploop la image del marcador de position.

Si falla una descarga, la image del marcador de position permanece. Al hacer clic en dicha fila, actúa normalmente. Si la descarga es exitosa, onclick en una fila con la image deseada, el UIImageView se expande a la altura de la fila (y el ancho aumenta a escala). El UIImageView nunca vuelve al tamaño normal. Los bashs brutos de establecer el marco de UIImageView no alivian el problema del cambio de tamaño misterioso.

// from my - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; method // after boilerplate cell dequeuing code cell.textLabel.text = [selectedNoun title]; // add placeholder image UIImage *placeholderImage = [UIImage imageNamed:@"placeholder.png"]; cell.imageView.image = placeholderImage; [cell.imageView setContentMode:UIViewContentModeScaleAspectFit]; //... // If the image has been downloaded I set it cell.imageView.image = iconDownloader.image; 

Esto me está volviendo loco. En realidad, solo sucede en una de las dos tablas de mi aplicación, pero después de compararlas con la línea o la línea no puedo ver ninguna diferencia. Esperando que alguien haya encontrado esto antes.

¡Gracias!

EDIT: No tengo una buena explicación para mi solución, aparte de decir que las imágenes con un tamaño determinado parecen conducir a este comportamiento y el uso de miniaturas reales (incluso las imágenes un poco más grandes que el marco UIImageView) no exhiben este comportamiento .

Si tiene UITableViewCell personalizado, asegúrese de que su UIImageView no se nombra con "imageView"

Las únicas cosas que vienen a la mente que afectan el tamaño y el aspecto de una vista dentro de su supervisión son:

  1. ¿Estás cambiando las properties frame / bounds / center en cualquier lugar? ¿Dónde / cómo se establece inicialmente el marco?

  2. imageView.autoResizingMask debe establecerse en UIViewAutoResizingNone

  3. imageView.clipsToBounds debe establecerse en YES

EDITAR: más sugerencias

Estoy disparando en la oscuridad b / c su código publicado se ve bien y si ha configurado imageView.clipsToBounds que debería restringir la image dibujada al marco de la image. Aquí hay un par de cosas más que probar:

  1. Implementar tableView:willDisplayCell:forRowAtIndexPath: y establecer imageView properties de imageView . Si imageView.frame es el problema, es probable que esto no lo solucione.

  2. Agregue su propio UIImageView a la celda configurada de la manera que lo desee y no use la propiedad built-in imageView . Si el comportamiento de la celda pnetworkingeterminada está causando el problema, esto debería funcionar.

EDITAR: grandes problemas de image

No sé exactamente qué tan grandes son las "imágenes realmente grandes" que está utilizando actualmente, pero es probable que sean el problema. De los documentos de UIImage (el énfasis es mío):

Debe evitar crear objects UIImage que tengan un tamaño superior a 1024 x 1024. Además de la gran cantidad de memory que consumiría una image, puede tener problemas al usar la image como una textura en OpenGL ES o al dibujar la image en una vista o capa . Esta restricción de tamaño no se aplica si está realizando manipulaciones basadas en código, como cambiar el tamaño de una image de más de 1024 x 1024 píxeles al dibujarlo en un context de charts respaldados por bitmap. De hecho, es posible que necesites cambiar el tamaño de una image de esta manera (o dividirla en varias imágenes más pequeñas) para dibujarla en una de tus vistas.

Mi problema fue ligeramente diferente, tuve un UITableViewCell personalizado con UITableViewCell propio y cuando la celda desapareció y reapareció, la image tendría un tamaño incorrecto. Mi problema era que estaba configurando cell.imageView en un lugar y cell.thumbnail (image personalizada) en otro, así que cambié todas las references a cell.thumbnail.

Espero que ayude a alguien en el futuro con un problema similar.

Esta respuesta me ayudó. Pero tuve que asegurarme de llamar a [cell layoutSubviews] en el método que realmente hace la configuration, así:

 cell.imageView.image = image; [cell layoutSubviews]; 

Espero que esto te sea útil.

En estas situaciones utilizo este framework Image loader. Incluye un método para establecer una image de marcador de position de su elección, mientras se descargan imágenes en segundo plano, y como un beneficio adicional, las imágenes en caching que garantizan la misma image nunca tendrán que downloadse dos veces. Es un gran trabajo que he encontrado muy útil para la carga de imágenes en tablas.

SDWebImage: https://github.com/rs/SDWebImage

Tuve el mismo problema, y ​​no entendí el motivo. De todos modos, es algo relacionado con la image del marcador de position: si carga una image del mismo tamaño que el marcador de position, no se realizará ningún cambio de tamaño, pero si los tamaños no coinciden, la image cargada se cambiará al tamaño de las dimensiones del marcador de position y vuelve a cambiar de tamaño cuando se hace clic.

Por lo tanto, si desea evitar el problema, use un marcador de position que coincida con el alto de la fila.

sigue estos pasos:

  1. Seleccione ImageView en su celda personalizada
  2. vaya a Show to Identity Inspector
  3. Desplácese hasta el final y desmarque la casilla "Interacción del usuario habilitada".

Esto es bastante improbable, pero debe tratar de ver qué pasa con los frameworks de las subvistas de UITableViewCell cuando su propiedad isSelected cambia de NO a YES (es decir, lo que sucede cuando toca una celda). Dudo que eso ayude mucho, pero vale la pena investigar (si puedes encontrar algo … eso es todo bajo el dominio de UITableViewCell, me imagino).

También debe search en la propiedad clipsToBounds de clipsToBounds . ¿Tal vez eso tenga algo que ver con eso?

haciendo algo como

 CGRect bounds = [self bounds]; [self setImage:image]; [self setBounds:bounds]; 

Cuando la configuration de la image soluciona el problema para mí

Si vuelve a cargar la vista de tabla cuando termina de cargarse, la image obtiene el tamaño que se suponía que tenía

 [self.tableview reloadData];