- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的单元格有一个从网络下载的图像,因此我需要将单元格的高度设置为动态。图片下载完成后,我将调用 self.collectionView.reloadItems(at: [indexPath])
来触发委托(delegate)方法来设置新的高度。
但似乎reloadItems
方法会重新创建一个单元格,而不仅仅是重新布局一个原始的重用单元格。
我该如何解决这个问题?这是苹果的 UICollectionView 上的错误还是我做错了什么?
完整代码:
// code from ViewController
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: AnnounmentWallCollectionViewCell.cellIdentifier, for: indexPath) as! AnnounmentWallCollectionViewCell
let announcement = announcements[indexPath.row]
cell.collectionView = collectionView
cell.setBanner(from: announcement.banner, indexPath: indexPath, completion: { [unowned self] (height) in
self.bannersHeight[indexPath.row] = height
})
cell.setHTMLContent(announcement.content)
contentsHeight[indexPath.row] = cell.htmlContentSize.height
printD("indexPath: \(indexPath)")
return cell
}
// code from cell
func setBanner(from url: URL?, indexPath: IndexPath, completion: @escaping (_ height: CGFloat)->()) {
// URL(string: "https://i.imgur.com/qzY7BJ9.jpg")
if let url = url {
if let banner = SDImageCache.shared().imageFromDiskCache(forKey: url.absoluteString) {
self.bannerView.isHidden = false
self.bannerView.image = banner.scaleWidth(to: self.bounds.width - 32) // leading + trailling
self.bannerHeight.constant = self.bannerView.image?.size.height ?? 1
completion(self.bannerHeight.constant)
printD("NO Download: \(indexPath)")
let animationsEnabled = UIView.areAnimationsEnabled
UIView.setAnimationsEnabled(false)
self.collectionView.reloadItems(at: [indexPath])
UIView.setAnimationsEnabled(animationsEnabled)
} else {
DispatchQueue.global().async {
SDWebImageDownloader.shared().downloadImage(with: url, options: .useNSURLCache, progress: nil) { (banner, data, error, finished) in
DispatchQueue.main.async {
if let banner = banner {
SDImageCache.shared().store(banner, forKey: url.absoluteString, toDisk: true)
self.bannerView.isHidden = false
self.bannerHeight.constant = banner.scaleWidth(to: self.bounds.width - 32)?.size.height ?? 1
completion(self.bannerHeight.constant)
self.collectionView.reloadData()
printD("Download: \(indexPath): \(self.bannerHeight.constant)")
} else {
self.bannerView.isHidden = true
self.bannerHeight.constant = 1
completion(self.bannerHeight.constant)
}
}
}
}
}
} else {
bannerView.isHidden = true
bannerHeight.constant = 1
completion(bannerHeight.constant)
}
}
// code from delegate
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let width = self.view.bounds.width
let height = bannersHeight[indexPath.row] + contentsHeight[indexPath.row]
+ 1 // sticker
+ 11 // banner top
printD("indexPath: \(indexPath): \(height)")
return CGSize(width: width, height: height)
}
最佳答案
这不是错误。这就是为给定索引路径重新加载单元格的方式。如果只想更新布局也可以试试
[self.collectionView.collectionViewLayout invalidateLayout]
代替
self.collectionView.reloadItems(at: [indexPath])
然后在委托(delegate)方法中返回适当的大小。
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return //whatever size that you want to return.
我还强烈建议您缓存图像大小,以便下次使用,而不是下载/计算超过...
关于ios - UICollectionView 会在调用 "reloadItems"方法时重新创建单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53219612/
我很难找到使用 NSDiffableDataSourceSnapshot reloadItems(_:) : 如果我要求重新加载的项目与数据源中已经存在的项目不相等,我会崩溃: Terminating
我想在用户选择联系人(方法didSelect contact)后仅重新加载单个单元格。如果单元格中的项目数量越来越大,该过程就会变得更慢。我还尝试在 DispatchQueue.main.async
我正在尝试创建一个程序,当用户在 UITextField 中输入文本时动态更新 collectoinView。下面是我为实现此目的而创建的扩展 我已经根据您的建议更新了代码以包含插入和删除语句,我仍在
我的单元格有一个从网络下载的图像,因此我需要将单元格的高度设置为动态。图片下载完成后,我将调用 self.collectionView.reloadItems(at: [indexPath]) 来触发
我有一个包含 uicollectionview 的 View Controller .每个collectionview 单元格都包含一个按钮,单击该按钮会在单元格中添加一个新标签。为了扩大每个单元格的
我有一个带有原型(prototype)单元格的 CollectionView。单元格有一个标签。随着时间的推移,标签经常更改值。我使用 collectionView.reloadItems[at: [
我有一个效果很好的 NSOutlineView。如果我更改模型,则当我调用:[self.myOutlineView reloadData] 时,大纲 View 会更新。然而,当我分析我的程序时,似乎有
我一直在使用 UICollectionView.reloadData() 来动态更新我的单元格,这非常有效,但它会导致动画非常笨拙。我连接到 func collectionView(_ collect
我已经针对此行为提出了问题。我想你明白我的意思,如果不明白请问。所以我有一个带有 collectionView 的小演示项目和一个包含整数的数据源。在我的项目中,由于 cpu 使用率较低,我必须通过调
我有一个 collectionView 单元格,它有一个 isExpanded: Bool 属性。当单元格第一次加载时,它被设置为 false 并且它只显示 1 行文本。如果文本有几行那么长,我会在第
我是一名优秀的程序员,十分优秀!