Cambiar el tamaño de la altura de la celda de la tabla según la altura de la image descargada

Recibo la URL de la image en time de ejecución y quiero download y mostrar estas imágenes en una tabla. Las imágenes se downloadán de forma asíncrona. Lo que es más importante es que quiero mostrar todas estas imágenes con sus tamaños reales.

Por favor ayúdame Gracias por adelantado:)

En el método de delegado, debes actualizar la image cuando termines de download, puedes usar

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationAutomatic]; 

Esto volverá a llamar

  -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

Por lo tanto, debería tenerlo utilizando la altura de la image si existe, una altura pnetworkingeterminada o una image de marcador de position si tiene una.

En primer lugar, recomiendo utilizar SDWebImage para la descarga asíncrona, si aún no lo está haciendo. Dependiendo de lo que desee, puede tener imágenes en caching en la memory o en el disco; esta última se realiza de la manera correcta, guardándolas en la carpeta de caching especial, para que iOS pueda eliminarlas si se queda sin espacio. También proporciona una categoría práctica en UIImageView, similar a lo que AFNetworking le brinda, pero con más opciones y un bloque de finalización opcional. De esa manera puedes hacer algo como esto:

 #import <SDWebImage/UIImageView+WebCache.h> ... - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // Create the cell... [cell.myImageView setImageWithURL:[NSURL URLWithString:@"http://example.com/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) { if (image != nil) { [self.images insertObject:image atIndex:indexPath.row]; [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:YES]; } }]; return cell; } 

De esa forma, descargue la image de forma asíncrona, establezca UIImageView correctamente, pero también usa el bloque para save la image en un NSMutableArray, de modo que pueda decirle a tableview la altura correcta. También le dice a la vista de tabla que actualice la altura de la celda cuya image se ha cargado. Luego, cuando la vista de tabla necesita saber qué tan alta es una celda dada, si la image se ha cargado, obtendremos el tamaño:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { id image = [self.images objectAtIndex:indexPath.row]; if ([image isKindOfClass:[NSNull class]]) { return defaultHeight; } else { return [image size].height + topPadding + bottomPadding; } } 

De esa manera sabemos la altura incluso de imágenes que están fuera de la pantalla (por ejemplo, cuando se ha desplazado hacia abajo). Esta solución supone que se comienza llenando NSMutableArray con valores NSNull, que luego se reemplazan con las imágenes cuando se cargan. Finalmente, si lo desea, puede usar SDWebImageManager para iniciar las descargas manualmente incluso antes de que se muestren las celdas.

Puede hacer su tamaño de UIImageView según la descarga de la image, pero le dará un mal aspecto .

Entonces te sugiero que hagas toda tu image del mismo tamaño, así que se verá bien y dulce.

Puedes usar esto para hacer toda tu image del mismo tamaño.

 + (UIImage *)imageScaledToSizeWithImage:(UIImage *)imagewww andsizeee:(CGSize)size { //avoid networkingundant drawing if (CGSizeEqualToSize(imagewww.size, size)) { return imagewww; } //create drawing context UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f); //draw [imagewww drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)]; //capture resultant image UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); //return image return image; } 

Pero si realmente desea mostrar una tabla con un tamaño de fila diferente, haga cambiar el tamaño de la fila en time de ejecución

cuando obtendrá la image y guarde su image en el dictionary con el valor de la key indexPath de la fila.

 [tableImageDict setObject:image forKey:[NSString stringWithFormat:@"%i,%i",indexPath.row,indexPath.section]]; 

y luego vuelva a cargar la fila de la tabla.

 [table reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]; 

Cambiará tu altura de fila

 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { UIImage *image = (UIImage *)[tableImageDict objectForKey: [NSString stringWithFormat:@"%i,%i", indexPath.row,indexPath.section]]; if (image != nil) { return image.size.height; } else{ return 44.0; } } 

Echa un vistazo a heightForRowAtIndexPath: Aquí hay otra publicación al respecto.

para eso tienes que crear UITableviewCell personalizado y puedes configurar el tamaño de la celda de Vista de tabla usando este código

 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { int rowHeight =0.0f; // here u can get particular Url by indexPath.row, now create UIImage object using that Url CGRect bioHeadingFrame = image.frame; rowHeight = size.height; //get the height of that image return rowHeight; } 

ahora la altura de la celda de su table aumenta según la altura de la image

Si la descarga asíncrona es su problema real, consulte la categoría UIImageView de la biblioteca AFNetworking. Especialmente esta function:

 - (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholderImage 

Puede include esta categoría UIimageview en su proyecto y establecer imágenes celulares derivadas de esa class.