Instagram / IGListKit

A data-driven UICollectionView framework for building fast and flexible lists.
https://instagram.github.io/IGListKit/
MIT License
12.87k stars 1.54k forks source link

Using the cell of automatic height calculation, pull the colloctionView to the bottom, then adding items and reloadData. The contentoffset of the collectionview will be wrong #1441

Open guakeliao opened 4 years ago

guakeliao commented 4 years ago

New issue checklist

General information

Explication

Using the cell of automatic height calculation, pull the colloctionView to the bottom, then adding items and reloadData. The contentoffset of the collectionview will be offset.But there's no problem with a fixed height cell( delete layout.estimatedItemSize = CGSize(width: 100, height: 40))

Debug information

# Please include debug logs using the following lldb command:
-------------willAddItems----------------
<UICollectionView: 0x7fbc07035c00; frame = (0 0; 414 896); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x600001238b70>; layer = <CALayer: 0x600001c36a60>; contentOffset: {0, 1041}; contentSize: {414, 1903}; adjustedContentInset: {88, 0, 34, 0}; layout: <UICollectionViewFlowLayout: 0x7fbc05e09c60>; dataSource: <IGListAdapter: 0x600002748340>>
------------endReloadData-----------------
<UICollectionView: 0x7fbc07035c00; frame = (0 0; 414 896); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x600001238b70>; layer = <CALayer: 0x600001c36a60>; contentOffset: {0, 0}; contentSize: {414, 1958}; adjustedContentInset: {88, 0, 34, 0}; layout: <UICollectionViewFlowLayout: 0x7fbc05e09c60>; dataSource: <IGListAdapter: 0x600002748340>>

Demo code

# I only changed a few lines of code in SelfSizingCellsViewController 
import IGListKit
import UIKit

final class SelfSizingCellsViewController: UIViewController, ListAdapterDataSource {

    lazy var adapter: ListAdapter = {
        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)
    }()
    let collectionView: UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        layout.estimatedItemSize = CGSize(width: 100, height: 40)
        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
        collectionView.backgroundColor = UIColor(red: 0.831_372_549, green: 0.945_098_039, blue: 0.964_705_882, alpha: 1)
        return collectionView
    }()
    var selectionModel0 = SelectionModel(options: ["Aenean lacinia bibendum nulla sed consectetur. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras mattis consectetur purus sit amet fermentum.",
                             "Donec sed odio dui. Donec id elit non mi porta gravida at eget metus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed posuere consectetur est at lobortis. Cras justo odio, dapibus ac facilisis in, egestas eget quam.",
                             "Sed posuere consectetur est at lobortis. Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis"," dis parturient montes, nascetur ridiculus mus. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum."," dis parturient montes, nascetur ridiculus mus. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum."," dis parturient montes, nascetur ridiculus mus. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum."," dis parturient montes, nascetur ridiculus mus. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum."," dis parturient montes, nascetur ridiculus mus. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum."," dis parturient montes, nascetur ridiculus mus. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum."," dis parturient montes, nascetur ridiculus mus. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum."," dis parturient montes, nascetur ridiculus mus. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum."," dis parturient montes, nascetur ridiculus mus. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum."], type: .fullWidth)

    var data = [SelectionModel]()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(collectionView)
        adapter.collectionView = collectionView
        adapter.dataSource = self
        data.append(selectionModel0)
        additems()
    }
    @objc func additems() {
        print("-------------willAddItems----------------\n\(self.collectionView)")
        selectionModel0.options.append("abcd\(arc4random())")
         self.adapter.reloadData { _ in
             print("------------endReloadData-----------------\n\(self.collectionView)")
         }
        self.perform(#selector(additems), with: nil, afterDelay: 5)
    }
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        collectionView.frame = view.bounds
    }

    // MARK: ListAdapterDataSource

    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {
        return data as [ListDiffable]
    }

    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {
        return SelfSizingSectionController()
    }

    func emptyView(for listAdapter: ListAdapter) -> UIView? { return nil }

}
guakeliao commented 4 years ago

I tested the native colloctionView, but there are also problem. It feels like Apple's problem