计算依赖于异步加载的单元格宽度和图像的 UITableViewCell 的高度

Calculating height of the UITableViewCell that is dependent on the cell width and image loaded asynchronously

当此高度基于 table 单元格宽度时如何正确计算 UITableViewCell 的高度。

我正在尝试将代码放入 heightForRowAtIndexPath 方法中,但尝试获取此方法中单元格的引用是不可能的,因为它会生成无限循环。在我的单元格中,我正在加载图像并尝试在所有单元格区域显示它。图像使用视图模式 AspectFit 进行缩放,因此图像的宽度适合单元格,但我不知道如何计算高度以便所有图像都可见。仅使用图像高度不是一个好的选择,因为此图像已缩放并适合单元格,因此缩放后其实际高度要小得多。

我正在使用此代码来计算高度,但我不知道如何正确实现它,所以此方法 return 图像在缩放并适合单元格内容后的正确高度。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSDictionary *item = self.items[indexPath.row];
UIImage *image = (UIImage *)item[COUPON_IMAGE_BINARY];

if (image) {
    // here the image is loaded so we can calculate somehow the
    // height of the cell after the image is scaled.
    // The image is always scaled to the width of the cell.
    // How can I get here the cell width?

    return image.size.height; // this only works for images that doesn't need any scaling
}
return 50;
}

这也是我的方法 cellForRowAtIndex:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

UIImageTableViewCell *cell = (UIImageTableViewCell *)[self.tableView dequeueReusableCellWithIdentifier:itemCellID
                                                             forIndexPath:indexPath];
if (cell.imageDownloadTask) {
    [cell.imageDownloadTask cancel];
}

NSMutableDictionary *item = self.items[indexPath.row];
if (item[COUPON_IMAGE_BINARY]) {
    cell.customImageView.image = (UIImage *)item[COUPON_IMAGE_BINARY];
    return cell;
}
// image is not loaded yet
NSURL *imageURL = [NSURL URLWithString:item[COUPON_IMAGE_URL]];
if (imageURL) {
    cell.imageDownloadTask = [self.session dataTaskWithURL:imageURL
                                         completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                             if (error) {
                                                 NSLog(@"ERROR: %@", error);
                                             } else {
                                                 NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
                                                 if (httpResponse.statusCode == 200) {
                                                     UIImage *image = [UIImage imageWithData:data];
                                                     item[COUPON_IMAGE_BINARY] = image; // image is ready to use
                                                     dispatch_async(dispatch_get_main_queue(), ^{
                                                         [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                                                                               withRowAnimation:UITableViewRowAnimationNone];
                                                     });
                                                 } else {
                                                     NSLog(@"Couldn't load image at URL: %@", imageURL);
                                                     NSLog(@"HTTP %d", httpResponse.statusCode);
                                                 }
                                             }
                                         }];
    [cell.imageDownloadTask resume];
} 
return cell;
}

我一直在寻找解决方案并阅读了将近 10 个,但提供的解决方案对我不起作用。有人可以更清楚地说明这个话题吗?我无法使这些图像 return 从服务器缩放,因为后端不支持此类功能。我想做的是在设备中缩放图像并将其显示为与原始比例一样宽的单元格,因此单元格高度取决于单元格宽度。

保持纵横比不变

CGFloat cellHeight = (image.size.height / image.size.width) * tableView.bounds.size.width;

确保将高度限制在特定点

cellHeight = MIN(cellHeight, MAX_HEIGHT);