Nano Hash - криптовалюты, майнинг, программирование

Как автоматически прокручивать ячейку коллекции до ближайшей ячейки (предыдущей или следующей) при выборе ячейки

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

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

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

введите здесь описание изображения

Это мой код,

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)

}

Ответы:


1

Вы можете просто перейти к этому 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)
    }

Надеюсь на эту помощь!

22.01.2020
  • в данном случае это будет .centeredHorizontally, а не .centeredVertically 22.01.2020
  • Но для меня, когда я выбираю последнюю ячейку, collectionView автоматически прокручивается до первой ячейки. 22.01.2020
  • @Hilaj, не могли бы вы опубликовать свой код? так что мы можем видеть, что идет не так. 22.01.2020
  • Я добавил свой код в вопрос. Почему перезагружаюсь значит надо выделить выбранную вкладку. 22.01.2020
  • @Hilaj, почему ты перезагружаешь collectionView? 22.01.2020
  • @Hilaj, если вам нужно перезагрузить collectionView, чем сначала перезагрузить, а затем прокрутить до этой ячейки 22.01.2020
  • Я тоже это сделал. Но на этот раз это не автопрокрутка до ближайшей ячейки. 22.01.2020
  • Могу ли я избежать reloadData(), чтобы выделить выбранную ячейку. Есть ли другой способ. 22.01.2020
  • @Hilaj, не могли бы вы опубликовать свой метод cellForItemAt, потому что он работает для меня 22.01.2020
  • я обновил ответ, пожалуйста, попробуйте и дайте мне знать, это работает или нет? 22.01.2020
  • До сих пор не работает. Я думаю, что перезагрузка и scrollToItem происходят в одном потоке. Может из-за этого автопрокрутка не работает 22.01.2020
  • Давайте продолжим обсуждение в чате. 22.01.2020

  • 2

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

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

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

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

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

    На ваш взглядDidLoad,

    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
    }
    
    22.01.2020
  • Привет, спасибо, все работает нормально. Но когда я выбираю последнюю ячейку, она автоматически прокручивается до первой. На самом деле в методе didSelect я перезагружаю collectionView. 22.01.2020
  • @Hilaj обновил ответ. не используйте reloadData(), перезагрузите только эту конкретную строку. 22.01.2020
  • Не из-за перезагрузки всех ячеек, невыбранные ячейки также выделяются 22.01.2020
  • Здесь происходит не снятие выделения с ранее выделенных ячеек, а добавление выделения к новым выделенным ячейкам. 22.01.2020
  • да, но при выборе collectionView изо всех сил пытается прокрутить и представить данные 22.01.2020
  • Привет Спасибо за вашу помощь. Но все же выбор есть для предыдущей ячейки. Чтобы снять выделение, мне нужно нажать еще раз. Здесь то, что мне нужно, такое же, как на изображении выше. При нажатии на новую ячейку мне нужно добавить selectionView в новую ячейку и очистить selectionView от предыдущей. 22.01.2020
  • все, что вам нужно удалить, вы можете сделать это в методе didDeselectItemAt. 22.01.2020

  • 3
    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()
                }
    }
    
    22.01.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..