Estoy tratando de usar mi ReusableCell para las celdas con imágenes en diferentes dimensiones. Las imágenes se colocan dentro de una caja negra de 220x150 con una escala de UIViewContentModeScaleAspectFit
.UITableViewCell con imágenes en diferentes dimensiones
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"NewsTableViewCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NewsItem *item = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:item.imageUrl]];
[cell.imageView setImage:[[UIImage alloc] initWithData:data]];
[cell.imageView setBackgroundColor:[UIColor blackColor]];
[cell.imageView setContentMode:UIViewContentModeScaleAspectFit];
CGRect imageViewFrame = cell.imageView.frame;
imageViewFrame.size.width = 220;
imageViewFrame.size.height = 150
[cell.imageView setFrame:imageViewFrame];
[cell.textLabel setText:item.title];
return cell;
}
Los anteriores resultados de código en un diseño como el de abajo y las imágenes son a veces cambian cuando se desplaza en la vista de tabla.
En lugar de esta disposición no estructurada, me gustaría que las imágenes se alinean así:
¿qué estoy haciendo mal con este ReusableCell?
EDIT1:
Estoy intentando crear un imageView y añadir esta imageView como supervista a cell.contentView.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"NewsTableViewCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NewsItem *item = [self.fetchedResultsController objectAtIndexPath:indexPath];
UIImage *placeholderImage = [UIImage imageNamed:@"ImagePlaceholderThumb"]; //220x150
UIImageView *imageView = [[UIImageView alloc] initWithImage:placeholderImage];
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:item.imageUrl]];
[imageView setImage:[[UIImage alloc] initWithData:data]];
[imageView setBackgroundColor:[UIColor blackColor]];
[imageView setContentMode:UIViewContentModeScaleAspectFit];
CGRect imageViewFrame = imageView.frame;
imageViewFrame.size.width = placeholderImage.size.width;
imageViewFrame.size.height = placeholderImage.size.height;
[imageView setFrame:imageViewFrame];
[cell.contentView addSubview:imageView];
[cell.textLabel setText:item.title];
return cell;
}
Los anteriores resultados de código en el siguiente:
Es como algunas de las imágenes son visibles en dos células. Parece que no mantienen el tamaño que he establecido en el imageViewFrame. ¿Sabes por qué?
Lo que está buscando se llama letter boxing y AFAIK es algo que UIKit no hará por usted a menos que lo haga usted mismo. – Till
Entonces, ¿cómo puedo hacer esto yo mismo? – dhrm
Ver el comentario en mi propia respuesta. Además, como un lado, la forma en que está creando el UIImageView y cargando sus datos está sucediendo CADA vez que la celda se vuelve visible desde fuera de la pantalla. Es posible que vea algunos desplazamientos incompletos. Me gustaría dos cosas de manera diferente: 0) cargar los datos de imagen de forma asíncrona y almacenarlos en caché con algo como EGOImageView, 1) Generalmente, si desea crear las subvistas de una celda al crear la celda, solo desea cambiar el contenido de las subvistas después// Configurar la celda ... – Keller