working uitableviewcell not iphone ios image uitableview resize

iphone - uitableviewcell - uitableviewautomaticdimension not working



UIImageView en mi UITableViewCell cambia de tamaño al hacer clic (10)

Tengo una UITableView bastante vainilla en mi aplicación que se usa para mostrar una imagen y un texto de manera predeterminada / estándar. La primera vez que se solicita un UITableViewCell, lo devuelvo con una imagen de marcador de posición y comienzo una descarga asíncrona de la imagen real. Cuando se completa la descarga, sustituyo la imagen del marcador de posición.

Si una descarga falla, la imagen del marcador de posición permanece. Hacer clic en una fila así actúa normalmente. Si la descarga se realiza correctamente, al hacer clic en una fila con la imagen deseada, UIImageView se expandirá a la altura de la fila (y el ancho aumentará en la escala). El UIImageView nunca vuelve a su tamaño normal. Los intentos crudos 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 línea o línea, no veo ninguna diferencia. Esperando que alguien se haya topado con esto antes.

¡Gracias!

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


En estas situaciones uso este marco de cargador de imágenes. Incluye un método para configurar una imagen de marcador de posición de su elección, mientras descarga imágenes en segundo plano, y como beneficio adicional, almacena en caché las imágenes garantizando que la misma imagen nunca tendrá que descargarse dos veces. Es un gran trabajo que he encontrado muy útil para la carga de imágenes de tableview.

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


Esto es bastante improbable, pero debe intentar ver qué sucede con los marcos de las subvistas de la 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 investigarlo (si puedes encontrar algo ... todo eso está bajo el capó de UITableViewCell, me imagino).

También debe mirar en la propiedad clipsToBounds la vista de clipsToBounds . Tal vez eso tiene algo que ver con eso?


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

  1. ¿Está cambiando las propiedades de marco / límites / centro en algún lugar? ¿Dónde / cómo se establece inicialmente el marco?

  2. imageView.autoResizingMask debe establecer en UIViewAutoResizingNone

  3. imageView.clipsToBounds debe establecer 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 imagen dibujada al marco imageView . Aquí hay un par de cosas más para probar:

  1. Implemente tableView:willDisplayCell:forRowAtIndexPath: y establezca las propiedades de imageView allí. Si imageView.frame es el problema, es probable que esto no lo solucione.

  2. Agregue su propio UIImageView a la celda configurada como lo desea y no use la propiedad incorporada de imageView . Si el comportamiento de la celda predeterminada está causando el problema, esto debería funcionar.

EDITAR: grandes problemas de imagen

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

Debe evitar la creación de objetos UIImage con un tamaño superior a 1024 x 1024. Además de la gran cantidad de memoria que consumiría una imagen de este tipo, es posible que tenga problemas al utilizar la imagen como textura en OpenGL ES o al dibujar la imagen 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 imagen de más de 1024 x 1024 píxeles dibujándola en un contexto de gráficos respaldado por mapa de bits. De hecho, es posible que necesite cambiar el tamaño de una imagen de esta manera (o dividirla en varias imágenes más pequeñas) para dibujarla en una de sus vistas.


Mi problema era ligeramente diferente, tenía un UITableViewCell personalizado con UITableViewCell propio y cuando la celda desaparecía y reaparecía, la imagen tendría un tamaño incorrecto. Mi problema fue que estaba configurando cell.imageView en un lugar y cell.thumbnail (imagen personalizada) en otro, así que cambié todas las referencias a cell.thumbnail.

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


Si tiene un UITableViewCell personalizado, asegúrese de que su UIImageView no tenga el nombre "imageView"


Si vuelve a cargar la vista de tabla cuando finaliza la carga, la imagen obtiene el tamaño que se suponía que tenía

[self.tableview reloadData];


Tuve el mismo problema, y ​​no descubrí la razón de eso. De todos modos, es algo relacionado con la imagen del marcador de posición: si carga una imagen del mismo tamaño que el marcador de posición, no se realizará ningún cambio de tamaño, pero si los tamaños no coinciden, la imagen cargada se redimensionará a las dimensiones del marcador de posición, y cambiar el tamaño de nuevo cuando se hace clic.

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


haciendo algo como

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

Cuando el ajuste de la imagen soluciona el problema para mí


sigue estos pasos:

  1. Seleccione el ImageView en su celda personalizada
  2. ir a Mostrar al inspector de identidad
  3. Desplácese hasta el final y desmarque la casilla de verificación "Interacción del usuario habilitada".

Esta respuesta me ayudó. Pero tenía que asegurarme de llamar a [cell layoutSubviews] en el método que realmente hace la configuración, como este:

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

Espero que esto pueda ser de utilidad para usted!