单元格在UICollectionView中重叠

时间:2018-03-09 18:46:28

标签: ios iphone swift uicollectionview urlrequest

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

Overlapping Cells

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

我已经跟踪错误,在我的网络请求的完成块中调用reloadSections。使用硬编码文本,集合视图可以使用初始布局正确显示。如果在完成块中调用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的以下委托方法修复了此问题

    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)
}

Update2:在为服务器实际检索到的数据切换出假的Lorem Ipsum数据后,问题重新出现。但是,我只需通过切换行

就能最终解决问题
self.collectionView.reloadSections(IndexSet(integer: 0))

self.reloadData()

我认为reloadSection(_ :)只是执行与reloadData()相同的操作,但是对于选定的部分,文档似乎并没有表示其他......但是它现在都有效!

1 个答案:

答案 0 :(得分:0)

从该代码我不确定原因,但可能尝试实现委托 UICollectionViewDelegateFlowLayout 提供的一些功能。

专注于功能

  

sizeForItemAtIndexPath

示例:

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