所以我一直在阅读这个问题的很多解决方案,似乎无论我做什么,当我的单元格中存在图像时,我仍然在UITableView中滚动。
以下是关于我如何生成细胞的一些信息。
我正在计算单元格的高度,并在索引路径
处缓存行高的高度func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if let height = cachedHeights[indexPath.row] {
return height
} else {
let post = dataSource.items[indexPath.row]
var CellClass = FeedTableViewCell.self
if let RegisteredCellClass = cells[post.reusableIdentifier] {
CellClass = RegisteredCellClass
}
cachedHeights[indexPath.row] = CellClass.height(post)
return CellClass.height(post)
}
}
我已经确认实际和计算的尺寸是相同的。
在索引路径中为单元格中的行配置单元格时,我设置所有元素并使用SDWebImage异步加载图像
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.section == 1 {
let post = dataSource.items[indexPath.row]
var wallCell: FeedTableViewCell?
if let registeredCell = tableView.dequeueReusableCell(withIdentifier: post.reusableIdentifier) as? FeedTableViewCell {
wallCell = registeredCell
if let postCell = wallCell as? FeedTableViewPostCell {
postCell.informationDelegete = self
postCell.actionDelegate = self
}
}
guard let cell = wallCell else { return FeedTableViewPostCell() }
cell.configureCell(post)
cell.delegate = self
return cell
} else {
return UITableViewCell()
}
}
配置单元格调用使用发布数据填充元素的单元格上的方法。有一个名为mediaview的子视图处理图像。如果他发布了图像,则会在该视图中配置它们。
for (index, element) in media.enumerated() where index < 3 {
addSubview(viewsArray[index])
viewsArray[index].setImage(with: element.source, placeholderImage: nil)
}
我读了一些关于SDWebImage的内容,导致它的默认UIImageView扩展中出现问题所以我自己编写了这个代码。
func setImage(with url: URL?, placeholderImage: UIImage?){
if let placeholder = placeholderImage{
DispatchQueue.main.async(execute: {
self.image = placeholder
})
}
SDWebImageManager.shared().loadImage(with: url, options: [SDWebImageOptions.cacheMemoryOnly, SDWebImageOptions.scaleDownLargeImages], progress: nil, completed: {(image, data, error, cacheType, finished, url) in
if finished {
DispatchQueue.main.async(execute: {
self.alpha = 0
UIView.transition(with: self, duration: 0.1, options: UIViewAnimationOptions.transitionCrossDissolve, animations: { () -> Void in
self.image = image
self.alpha = 1
}, completion: nil)
})
}
})
}
如果我在mediaview中注释掉设置图像的块,我的滚动非常流畅,所以我知道它不是细胞生成的另一部分。我的理解是,异步加载应该可以缓解滚动延迟,但我尝试了几乎所有东西都无济于事。对此的任何帮助或见解将不胜感激。