CollectionView Drag and Drop при внедрении в PageViewController
При использовании перетаскивания с UICollectionView, встроенным в UIPageViewController, делегат немедленно запускает didExit
при пейджинге.
- Начать жест перетаскивания
- Страница в новый просмотр
- 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
}
}