CollectionView Drag and Drop при внедрении в PageViewController

При использовании перетаскивания с 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
    }
}
Другие вопросы по тегам