gpt4 book ai didi

ios - 动态单元格大小取决于从 iOS 中的 URL 获取的图像大小

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:22:59 25 4
gpt4 key购买 nike

信息:

我有 Tableview,其中包含带有 Imageview 的单元格。在那个 Imageview 中,我正在从 imgURL 获取不同的图像...

我需要什么:

我需要根据从 imgURL 获取的图像高度来动态调整单元格高度。

NOTE: I am not using auto layout, but i am using auto resizing.

到目前为止我做了什么:

我在 ImageView 中使用了异步图像加载。 (通过 #import "UIImageView+WebCache.h")

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

HomePostCell *cell=[tableView dequeueReusableCellWithIdentifier:strIdentifier];
if (cell==nil) {
cell = [[HomePostCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:strIdentifier];
}

[cell.imgMain sd_setImageWithURL:[NSURL URLWithString:strImgURL] placeholderImage:[UIImage imageNamed:@"postPlaceholder"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
if (!error) {

}];


return cell;
}

right now screen of tableview

有什么解决办法吗?或者我们可以仅使用自动布局来调整单元格大小吗?

提前致谢..

最佳答案

在理想情况下,我通常希望 API 返回所有具有相同大小或可通过查询字符串参数配置的大小的图像,例如:/get_image/?width=400&height=400 等等

无论如何,这里的问题是,一旦单元格创建并准备好绘制到屏幕上,您就无法更新单元格的高度(换句话说,一旦它从 返回cellForRowAtIndexPath) 除非您手动重新加载该单元格或整个 TableView 。对我们来说幸运的是,sd_setImageWithURL 以异步方式工作,这意味着您将有机会在获取和存储图像后调用 tableView.reloadRowsAtIndexPath

重新加载将导致在重新加载的单元格上调用 heightForRowAtIndexPath,因此这次我们将获得正确的高度。

(由于表格 View 单元格是可重复使用的对象,它们不会存储有关它们用于配置其 UI 的数据的任何信息。因此,您需要将图像存储在 View Controller 中,最好是在数组。)

@interface ViewController ()

@property (nonatomic, strong) NSMutableArray *fetchedImages;
@end

@implementation ViewController
...

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
UIImage *image = [self.fetchedImages objectAtIndex:indexPath.row];
if (image) {
return image.size.height + 1.0; // 1.0 for the separator.
}
else {
return 50.0; // Default value..
}
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.fetchedImages.count;
}

综上所述,您可以在 (tableView:cellForRowAtIndexPath:) 方法中执行类似以下操作:

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

UIImage *image = [self.fetchedImages objectAtIndex:indexPath.row];

if (image) {
// If there is image don't bother fetching the image.
cell.imageView.image = image;
}
else {
NSURL *imageURL = [self.imageURLs objectAtIndex:indexPath.row];
[cell.imageView sd_setImageWithURL:imageURL placeholderImage:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
if (image) {
[self.fetchedImages replaceObjectAtIndex:indexPath.row withObject:image];
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}
}];
return cell;
}

这是我最终得到的结果:

enter image description here

您可以下载 test project并尝试使用它以更好地理解我上面所做的事情。

关于ios - 动态单元格大小取决于从 iOS 中的 URL 获取的图像大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39443575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com