CollectionView не прокручивает элемент — swift — программно

#swift #uicollectionview #collectionview #indexpath

#swift #uicollectionview #collectionview #indexpath

Вопрос:

У меня есть UICollectionView, установленный внутри UIView таким образом:

 videoCollectionView.delegate = self
videoCollectionView.dataSource = self
    
self.playerView.insertSubview(videoCollectionView, belowSubview: additionalItemsView)
videoCollectionView.fillSuperview()
  

Вот как реализованы методы источника данных и делегата

 extension CardView : UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout{


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    
    let numberOfURLS = cardModel?.urlStrings?.count
    return numberOfURLS!
}

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


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: self.bounds.width, height: self.bounds.height)
}
}
  

Как вы можете видеть из приведенного выше кода, каждая ячейка равна размеру collectionView.frame
Я хочу, чтобы ячейки CollectionView отображались горизонтально и могли прокручиваться через них.

это код, который я реализовал для горизонтальной прокрутки ячеек:

 fileprivate func goToNextVideo(){
    
    counter = counter 1
    counter = min(cardModel!.urlStrings!.count-1, counter)
    
    videoCollectionView.scrollToItem(at: IndexPath(item: 0, section: counter), at: .left, animated: true) 
}


fileprivate func goToPreviousVideo(){
    
    counter = counter - 1
    counter = max(0, counter)

    videoCollectionView.scrollToItem(at: IndexPath(item: 0, section: counter), at: .left, animated: true)
}
  

Я не знаю, по какой причине CollectionView не прокручивается до нужной ячейки, и я получаю это предупреждение в консоли:

 Warning: Invalid IndexPath <NSIndexPath: 0xa5dbc31284d24cfa> {length = 2, path = 1 - 0} specified - will use a contentOffset of {0,0} as a fallback value.
  

Ответ №1:

Мне кажется, что

 IndexPath(item: 0, section: counter)
  

выполняется в обратном направлении (дважды). Попробуйте

 IndexPath(item: counter, section: 0)
  

в обоих местах.

Комментарии:

1. Он не выдает мне предупреждение, как раньше, но он еще не прокручивается до элемента этого индексного пути, я также заметил, что размер содержимого CollectionView равен (355.0, 1667.0), что означает, что он развивается вертикально, а не горизонтально, как я хотел

2. Конечно, я тоже об этом подумал, но это другое дело. Вопрос о том, является ли это представлением коллекции с горизонтальной или вертикальной прокруткой, зависит от вас. Вы не показали ни одного кода, в котором вы настраиваете свой videoCollectionView , поэтому у меня нет оснований полагать, что вы делаете это правильно.

3. Я решил это, добавив пользовательский UICollectionViewFlowLayout() и установив для его свойства scrollDirection значение horizontal

4. Да, я не уверен, что вы подразумеваете под «пользовательским»; UICollectionViewFlowLayout имеет scrollDirection свойство, и вы можете просто установить его. Для этой цели вам не нужно создавать подклассы.