0

当使用嵌入在 UIPageViewController 中的 UICollectionView 进行拖放didExit时,分页时委托会立即触发。

  1. 开始拖放手势
  2. 页面到新视图
  3. CollectionDropDelegate 立即触发:
  • newCV.didEnter
  • oldCV.didExit
  • newCV.didExit

newCV.didUpdate永远不会被调用。如果我们在这一点上放开下降,它就会取消。我的 PageViewController 不是全屏的,所以如果我将拖动移出并移回,我仍然可以在分页后执行拖放,但这是一个糟糕的用户体验。

笔记:

  • 不使用 UICollectionViewController
  • CollectionView 被添加到 UIViewController 层次结构中viewDidLoad

有任何想法吗?

4

1 回答 1

0

我能够通过切换来解决这个问题collectionView.isUserInteractionEnabled。弄清楚在生命周期中的哪个位置执行此操作有点挑战性,最终我最终使用了 UIPageViewControllerDelegatedidFinishAnimating...

所以在我的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
    }
}
于 2020-08-23T16:12:35.750 回答