IGListKit icon indicating copy to clipboard operation
IGListKit copied to clipboard

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

Open guakeliao opened this issue 4 years ago • 1 comments

New issue checklist

  • [X] I have reviewed the README and documentation
  • [X] I have searched existing issues and this is not a duplicate
  • [X] I have attempted to reproduce the issue and include an example project.

General information

  • IGListKit version:4.0
  • iOS version(s):11.4.1 (921.9)
  • CocoaPods/Carthage version:1.8.4
  • Xcode version:11.4.1
  • Devices/Simulators affected:iPhone 11 Pro Max
  • Reproducible in the demo project? (Yes/No):Yes
  • Related issues:Found none

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 avatar May 12 '20 13:05 guakeliao

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

guakeliao avatar May 13 '20 02:05 guakeliao