计算UITableViewCell的高度,该高度取决于单元格宽度和异步加载的图像

时间:2015-02-25 11:44:00

标签: ios objective-c iphone uitableview ipad

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

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

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

- (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个,但提供的解决方案对我来说并不起作用。有人可以更多地谈谈这个话题吗?我无法使从服务器返回的图像缩放,因为后端不支持此类功能。我想要做的是缩放设备中的图像并将其显示为与原始比例的单元格一样宽,因此单元格高度取决于单元格宽度。

1 个答案:

答案 0 :(得分:4)

只需保持宽高比

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

确保将高度限制在某一点

cellHeight = MIN(cellHeight, MAX_HEIGHT);