Zunächst einmal würde ich sehr empfehlen, SDWebImage für das asynchrone Herunterladen zu verwenden, wenn Sie nicht bereits tun. Je nachdem, was Sie wollen, können Sie Bilder im Speicher oder auf der Festplatte zwischenspeichern - letzteres geschieht in der richtigen Weise, indem Sie sie im speziellen Cache-Ordner speichern, damit iOS sie löschen kann, wenn der Speicherplatz knapp wird. Es bietet auch eine praktische Kategorie in UIImageView, ähnlich wie AFNetworking, aber mit mehr Optionen und einem optionalen Abschlussblock. So können Sie etwas tun können:
#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;
}
diese Weise können Sie laden Sie das Bild asynchron, stellen Sie das richtige UIImageView, aber Sie verwenden auch den Block das Bild in einem NSMutableArray zu speichern, so dass Sie die Tableview sagen kann, die korrekte Höhe. Es teilt der Tabellenansicht außerdem mit, dass die Höhe der Zelle, deren Bild geladen wurde, aktualisiert wird. Dann, wenn die Tabellenansicht wissen muss, wie hoch eine gegebene Zelle ist, wenn das Bild geladen ist, werden wir die Größe von ihm bekommen:
- (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;
}
}
diese Weise können wir die Höhe sogar von Bildern kennen, die ausgeschaltet sind (zB wenn Sie nach unten gescrollt haben). Bei dieser Lösung wird davon ausgegangen, dass Sie NSMutableArray mit NSNull-Werten füllen, die beim Laden durch die Images ersetzt werden. Schließlich, wenn Sie möchten, können Sie SDWebImageManager verwenden, um die Downloads manuell zu starten, noch bevor die Zellen angezeigt werden.
ein paar Fragen für ya Mann. Werden diese Bilder die gesamte Breite des Bildschirms von 320 Pixel einnehmen? oder werden sie nur unter der anderen angezeigt, unabhängig von der Breite? Oder wenn die Breite des vorherigen Bilds kleiner als 320 ist und die nächste Breite auch in die verbleibende Breite passt (320-prev_img_width), wird diese neben dem vorherigen Bild oder unterhalb des vorherigen Bildes angezeigt. –