Po pierwsze, zdecydowanie zalecam użycie SDWebImage do asynchronicznego pobierania, jeśli jeszcze tego nie zrobiłeś. W zależności od tego, co chcesz, możesz ustawić pamięć podręczną w pamięci lub na dysku - ta ostatnia jest wykonywana we właściwy sposób, zapisując je w specjalnym folderze pamięci podręcznej, więc iOS może je usunąć, gdy zabraknie miejsca. Zapewnia także przydatną kategorię w UIImageView, podobnie jak w przypadku AFNetworking, ale z większą liczbą opcji i opcjonalnym blokiem ukończenia. W ten sposób można zrobić coś takiego:
#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;
}
ten sposób można pobrać obraz asynchronicznie, ustaw UIImageView poprawnie, ale również skorzystać z bloku, aby zapisać obraz w NSMutableArray, więc można powiedzieć tableview właściwa wysokość. Informuje również widok tabeli, aby zaktualizować wysokość komórki, której obraz został załadowany. Wtedy, gdy widok tabeli musi wiedzieć, jak wysoko dana komórka jest, jeśli obraz został załadowany, będziemy się z niego rozmiar:
- (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;
}
}
ten sposób wiemy, wysokość nawet obrazów, które są wyłączone -screen (np. kiedy przewinąłeś na dół). To rozwiązanie zakłada, że zaczynasz od zapełnienia wartości NSMutableArray wartościami NSNull, które są następnie zastępowane obrazami po ich załadowaniu. Wreszcie, jeśli chcesz, możesz użyć SDWebImageManager, aby ręcznie rozpocząć pobieranie jeszcze przed wyświetleniem komórek.
kilka pytań dla ciebie człowieka. Czy te obrazy zajmą całą szerokość ekranu 320px? czy będą one wyświetlane tuż pod drugim, niezależnie od szerokości? Lub jeśli szerokość poprzedniego obrazu jest mniejsza niż 320, a następna również mieści się w pozostałej szerokości (320-prev_img_width), to pojawi się obok obrazu prev lub poniżej prev. –