iOS: разрешить взаимодействие с пользователем, но отключить выбор других ячеек в UICollectionView при прокрутке - PullRequest
0 голосов
/ 01 марта 2019

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

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
    if collectionView.isScrollEnabled {
        isDragging = true
        collectionView.isUserInteractionEnabled = false
    }
}

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    if !decelerate {
        collectionView.isUserInteractionEnabled = true
    }
}

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    collectionView.isUserInteractionEnabled = true
}

Однако настройка isUserInteractionEnabled = false означает, что я не могу вручную преждевременно остановить прокрутку в случае, если я сделал быстрое пролистывание, что не желательно.Как мне этого добиться?Спасибо.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 02 марта 2019

Решение:

Этого можно достичь без включения / отключения взаимодействия с пользователем.

  1. Сделать isDragging глобальной переменной.

    var isDragging: Bool = false

  2. Внести следующие изменения в UIScrollViewDelegate методы:

    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
         self.isDragging = true
    }
    
    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
         if !decelerate {
             self.isDragging = true
         }
         else {
             self.isDragging = false
         }
    }
    
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
         self.isDragging = false
    }
    
  3. Добавить следующую логику в UICollectionViewDelegate s didSelectItemAt метод:

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
         if !self.isDragging {
             // Your code related to cell selction here.
         }
    }
    
...