Как автоматически прокрутить collectionviewcell к ближайшей ячейке (предыдущей или следующей) при выборе ячейки - PullRequest
3 голосов
/ 22 января 2020

Я сейчас работаю над быстрым приложением. В одном контроллере вида у меня есть collectionView с горизонтальной прокруткой. collectionView выглядит как горизонтальные вкладки с большим количеством вкладок. Поэтому некоторые collectionViewCell's не видны в начальный момент времени.

Что мне нужно, так это то, что я хочу автоматически прокрутить collectionView к следующей ячейке (если collectionView имеет невидимую ячейку справа) или к предыдущей ячейке (если у нее есть невидимая ячейка слева), когда я выберите collectionViewCell. Я использовал какао-стручок (SwipeMenuViewController), но это делает некоторые проблемы с презентацией. Пожалуйста, помогите мне реализовать то же самое с collectionView.

Пожалуйста, смотрите изображение для большей ясности.

enter image description here

Это мой код,

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return self.tabArray.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "tabCell", for: indexPath) as! tabCollectionViewCell
    cell.tabLabel.text = self.tabArray[indexPath.row]
    if selectedTabArray.contains(indexPath) {
        cell.bottomView.isHidden = false
    } else {
        cell.bottomView.isHidden = true
    }

    return cell
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    self.selectedTabArray.removeAll()
    selectedTabArray.append(indexPath)
    self.tabCollectionView.reloadData()
    tabCollectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)

}

Ответы [ 3 ]

6 голосов
/ 22 января 2020

Вы можете просто прокрутить до этого indexPath на didSelectItemAt Метод

var selectedIndex = 0

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "tabCell", for: indexPath) as! tabCollectionViewCell
    cell.tabLabel.text = self.tabArray[indexPath.item]
    if self.selectedIndex == indexpath.item {
        cell.bottomView.isHidden = false
    } else {
        cell.bottomView.isHidden = true
    }

    return cell
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    self.selectedIndex = indexpath.item
    self.tabCollectionView.reloadData()
    tabCollectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
    }

Надеюсь, эта справка!

3 голосов
/ 22 января 2020

Вы можете использовать метод didSelectRowAt, чтобы получить indexPath выбранной ячейки. затем проверьте, не является ли эта ячейка последней. Если это не так, прокрутите вправо, в противном случае прокрутите влево.

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true) 
    collectionView.reloadItems(at: [indexPath])

}

ОБНОВЛЕНИЕ1:

Я не увидел изображение при ответе на вопрос, так как оно еще не был добавлен Я обновил свой ответ.

ОБНОВЛЕНИЕ2:

В вашем viewDidLoad

collectionView.allowsMultipleSelection = false // in your view didLoad

затем используйте наблюдатели свойств для изменения выбранного индекса.

var selectedIndexPath : IndexPath = IndexPath(item: 0, section: 0) {
    didSet {
        self.collectionView.reloadItems(at: [selectedIndexPath])
    }
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return self.tabArray.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "tabCell", for: indexPath) as! tabCollectionViewCell
    cell.tabLabel.text = self.tabArray[indexPath.row]
    cell.bottomView.isHidden = (indexPath == selectedIndexPath) ? false : true
    return cell
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    selectedIndexPath = indexPath
    tabCollectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)

}

func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
    let cell = collectionView.cellForItem(at: indexPath) as! tabCollectionViewCell
    cell.bottomView.isHidden = true
}
0 голосов
/ 22 января 2020
var selectedIndex = 0

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "tabCell", for: indexPath) as! tabCollectionViewCell
    cell.tabLabel.text = self.tabArray[indexPath.item]
    if self.selectedIndex == indexpath.item {
        cell.bottomView.isHidden = false
    } else {
        cell.bottomView.isHidden = true
    }

    return cell
    }

Замените collectionView didSelectItemAt на следующий метод для решения проблемы выбора и перезагрузите коллекцию,

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

        self.selectedIndex = indexpath.item
        UIView.animate(withDuration: 0, animations: {
                tabCollectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
    }) { (_) in
                self.tabCollectionView.reloadData()
            }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...