首页 > 解决方案 > 嵌入 PageViewController 时的 CollectionView 拖放

问题描述

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

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

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

笔记:

有任何想法吗?

标签: iosuicollectionviewuipageviewcontrolleruicollectionviewdropdelegate

解决方案


我能够通过切换来解决这个问题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
    }
}

推荐阅读