我有一个单元格,我现在在其中显示从服务器下载的图像。现在我用静态高度显示图像,但现在我想像 facebook 和 instagram 一样制作动态图像。例如,如果我上传图像 320 * 100,那么我的单元格需要变为 300*100。如果需要,还建议更改服务器端我正在使用 afnetworking 图像加载类。
编辑: 我尝试了给定的解决方案,但现在的问题是,当第二次进入cellforindexpath方法时,单元格会随着 jerk 调整大小。这只会发生在第一个单元格中。
我有一个单元格,我现在在其中显示从服务器下载的图像。现在我用静态高度显示图像,但现在我想像 facebook 和 instagram 一样制作动态图像。例如,如果我上传图像 320 * 100,那么我的单元格需要变为 300*100。如果需要,还建议更改服务器端我正在使用 afnetworking 图像加载类。
编辑: 我尝试了给定的解决方案,但现在的问题是,当第二次进入cellforindexpath方法时,单元格会随着 jerk 调整大小。这只会发生在第一个单元格中。
我已经完成了类似的任务,在桌子上显示图像并调整 tableview 单元格的大小,以便图像沿全屏宽度显示
IndexPath 处的行高
var cachedHeight = [IndexPath : CGFloat]()
override func tableView(_ tableView: UITableView, heightForRowAtindexPath: IndexPath) -> CGFloat {
let default_height : CGFloat = 332.0
// lookup for cached height
if let height = cachedHeight[indexPath]{
return height
}
// no cached height found
// so now try for image so that cached can be calculated and cached
let cache : SDImageCache = SDImageCache.shared()
let image : UIImage? = cache.imageFromDiskCache(forKey: self.viewModel?.getProductImage(of: indexPath.row, at: 0))
if let image = image{
let baseHeight : CGFloat = CGFloat(332 - 224) // cell height - image view height
let imageWidth = self.tableView.frame.size.width
let imageHeight = image.size.height * imageWidth / image.size.width
cachedHeight[indexPath] = imageHeight + baseHeight
return cachedHeight[indexPath]!
}
//
// even if the image is not found, then
// return the default height
//
return default_height
}
IndexPath 处的行的单元格
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let sdCache = SDImageCache.shared()
let cell = tableView.dequeueReusableCell(withIdentifier: "MyXYZCell", for: indexPath) as! AuctionListTableViewCell
let imageURL = self.viewModel?.getProductImage(of: indexPath.row, at: 0)
if let imageURL = imageURL {
if (sdCache.imageFromCache(forKey: imageURL) != nil) {
//
// image data already persist on disk,
// cell height update required
//
cell.auctionImageView.sd_setImage(with: URL.init(string: imageURL), completed: nil)
}
else
{
cell.auctionImageView.sd_setImage(with: URL.init(string: imageURL), completed: { (image, err, cacheType, url) in
self.tableView.reloadRows(at: [indexPath], with: UITableViewRowAnimation.none)
})
}
}
//other cell customization code
return cell
}
我用过SDWebImage。你可以使用它,或者在AFNetworking
.
主题演讲:
cachedHeight
用于缓存由 索引的单元格的高度IndexPath
,因为从磁盘读取图像是安静的 I/O 详尽任务,这会导致表格视图滚动滞后。heightForRow
我检查中,图像是否在缓存中,如果在缓存中,则计算高度,将其存储到 中cachedHeight
,否则返回默认高度。(我的默认高度是为我的占位符图像计算的)cellForRowAtIndexPath
我检查过的是图像在缓存中。如果图像在缓存中,则不需要重新加载,因为已经计算了高度。否则,我会尝试网络提取,当提取完成时,我请求 tableview 重新加载该单元格。希望它有所帮助,快乐编码。
我已经解决了这个问题。如果您必须使图像视图的高度和宽度动态化,则要求服务器在 API 响应中发送图像宽度和高度。一旦你得到两者,根据图像宽度和屏幕宽度计算图像高度。采取图像高度的约束。并将计算的高度分配给图像高度约束。
要计算图像高度,请使用以下公式:-
imageHeight = (screen_width * actual_image_height) / actual_image_width