Gugulethu
Gugulethu

Reputation: 1436

Scrolling to a collectionView to a specie Index

I have a collectionView with a number of cells and when I load it I want to select a specific cell, show it as selected and scroll the collection view to the that selected cell's location without having to do the scrolling myself.

I can show the cell as selected but the scrolling doesn't seem to work from the provided function.

This is my attempt to doing it.

class RepsCellView: UICollectionViewCell, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {

    lazy var repsValuesCollectionView: UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .horizontal
        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
        collectionView.backgroundColor = UIColor.black
        collectionView.showsHorizontalScrollIndicator = false
        collectionView.translatesAutoresizingMaskIntoConstraints = false

        return collectionView
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupViews()
    }



    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func setupViews() {

        addSubview(repsValuesCollectionView)

        //...
        //  Cell
        let selectedIndex = IndexPath(item: 19, section: 0)
        repsValuesCollectionView.selectItem(at: selectedIndex, animated: true, scrollPosition: [.centeredHorizontally, .centeredVertically])

    }

    //  CollectionView DataSource Functions
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 100
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
        return cell
    }
}

Thanks in advance.

Upvotes: 0

Views: 464

Answers (1)

Wilson
Wilson

Reputation: 9136

what ViewController event method are you using to run your code?

Anyway I could scroll it placing your code in the ViewController event method viewDidAppear method.

class CollectionViewController: UICollectionViewController {
  override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    let cellToSelect = IndexPath(item: 99, section: 0)

    self.collectionView?.scrollToItem(at: cellToSelect, at: [.centeredHorizontally, .centeredVertically], animated: true)
  }

  override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 1
  }

  override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! RepsCellView
    cell.setupViews() // added this line
    return cell
  }
}

Upvotes: 1

Related Questions