gpt4 book ai didi

ios - UICollectionView 中的单元格重叠

转载 作者:行者123 更新时间:2023-11-30 11:42:11 38 4
gpt4 key购买 nike

我正在 UICollectionView 中使用动态大小的单元格显示对自定义 API 的 Web 请求的结果。但是,当我在获取数据后调用 reloadSections 时,许多单元格显示重叠。

overlap cells

当 View 滚动时,单元格显示在适当的位置。

我已经找到了在 Web 请求的完成 block 中调用 reloadSections 的错误。使用硬编码文本, Collection View 可以按照初始布局正确显示。如果在完成 block 中调用reloadSections,则会发生错误。下面是相关代码:

override func viewDidLoad() {
super.viewDidLoad()

collectionView.register(UINib.init(nibName: "ExhibitionsCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "ExhibitionsCollectionViewCell")
layout.estimatedItemSize = CGSize(width: 1, height: 1)

collectionView.dataSource = exhibitionsDataSource
collectionView.delegate = self

store.fetchExhibitions {
(exhibitionsResult) -> Void in

switch exhibitionsResult {
case let .success(exhibitions):
print("Successfully found \(exhibitions.count) exhibitions.")
if exhibitions.first != nil {
self.exhibitionsDataSource.exhibitions = exhibitions
}
case let .failure(error):
print("Error fetching exhibitions: \(error)")
self.exhibitionsDataSource.exhibitions.removeAll()
}
// this is the line that produces the erroneous layout
self.collectionView.reloadSections(IndexSet(integer: 0))
}

}

发出网络请求的代码:

func fetchExhibitions(completion: @escaping (ExhibitionsResult) -> Void) {

let url = WebAPI.exhibitionsURL
let request = URLRequest(url: url)
let task = session.dataTask(with: request) {
(data, response, error) -> Void in

let result = self.processExhibitionsRequest(data: data, error: error)
OperationQueue.main.addOperation {
completion(result)
}

}

task.resume()
}

如果有任何其他代码有助于回答此问题,请告诉我。

更新:我通过实现 UICollectionViewDelegateFlowLayout 的以下委托(delegate)方法解决了该问题

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

let cell = collectionView.cellForItem(at: indexPath)
let height = cell?.contentView.bounds.height ?? 1
let width = cell?.contentView.bounds.width ?? 1


return CGSize(width: width, height: height)
}

更新2:将我的假 Lorem Ipsum 数据切换为实际从服务器检索的数据后,问题再次出现。不过,我最终通过切换线路就解决了这个问题

self.collectionView.reloadSections(IndexSet(integer: 0))

self.reloadData()

我认为 reloadSection(_:) 只是执行与 reloadData() 相同的操作,但对于选定的部分,并且文档似乎没有表明其他情况......但无论哪种方式现在都可以工作!

最佳答案

从该代码中我不确定原因,但也许尝试实现委托(delegate)UICollectionViewDelegateFlowLayout提供的一些功能。

关注功能

sizeForItemAtIndexPath

示例:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
return CGSizeMake(320, 500);
}

关于ios - UICollectionView 中的单元格重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49200262/

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