#ios #uicollectionview #uipageviewcontroller #uicollectionviewdropdelegate
#iOS #uicollectionview #uipageviewcontroller #uicollectionviewdropdelegate
Вопрос:
При использовании перетаскивания с 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
}
}