Перетаскивание CollectionView при внедрении в pageViewController

#ios #uicollectionview #uipageviewcontroller #uicollectionviewdropdelegate

#iOS #uicollectionview #uipageviewcontroller #uicollectionviewdropdelegate

Вопрос:

При использовании перетаскивания с UICollectionView, встроенным в UIPageViewController, делегат немедленно запускается didExit при подкачке страницы.

  1. Начать жест перетаскивания
  2. Страница для нового просмотра
  3. CollectionDropDelegate немедленно срабатывает:
  • newCV.didEnter
  • oldCV.didExit
  • newCV.didExit

newCV.didUpdate никогда не вызывается. Если мы отпустим перетаскивание в этот момент, оно отменяется. Мой pageViewController не работает в полноэкранном режиме, поэтому, если я перемещаю перетаскивание наружу и обратно, я все равно могу выполнить удаление после подкачки страницы, но это плохой пользовательский интерфейс.

Примечания:

  • Не используется UICollectionViewController
  • CollectionView добавляется в иерархию UIViewController в viewDidLoad

Есть идеи?

Ответ №1:

Я смог решить это путем переключения collectionView.isUserInteractionEnabled . Выяснить, где в жизненном цикле это сделать, было немного сложно, и в конечном итоге я закончил тем, что использовал UIPageViewControllerDelegate didFinishAnimating...

Итак, в моем ContentViewController.viewDidLoad я установил collectionView.isUserInteractionEnabled = false , а затем в делегате мне нужно условно включить / отключить просмотры коллекции.

 func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { 
    if completed {
        guard let showing = pageViewController.viewControllers?.first as? DayViewController else {
            assertionFailure()
            return
        }
        
        // Disable All
        previousViewControllers.forEach {
            if let dayVC = $0 as? DayViewController {
                dayVC.collectionView?.isUserInteractionEnabled = false
            }
        }
        // Enable Showing
        showing.collectionView?.isUserInteractionEnabled = true
    } else {
        
        guard let showing = previousViewControllers.first as? DayViewController else {
            assertionFailure()
            return
        }
        
        // Disable All
        viewControllers?.forEach {
            if let dayVC = $0 as? DayViewController {
                dayVC.collectionView?.isUserInteractionEnabled = false
            }
        }
        // Enable Showing
        showing.collectionView?.isUserInteractionEnabled = true
    }
}