禁用 uicollectionview 水平滚动的外部平移手势

Posted

技术标签:

【中文标题】禁用 uicollectionview 水平滚动的外部平移手势【英文标题】:disable external pan gesture for uicollectionview horizontal scroll 【发布时间】:2018-11-07 12:45:39 【问题描述】:

在我的 viewController 中,我有一个 CollectionView:mainCollectionView 作为 UIView 子视图,其中包含三个水平滚动的单元格(viewController 框架大小)。 mainCollectionView 也有一个 panGesture 显示另一个 viewController:sideMenuController

在我的mainCollectionView Cell 中是另一个水平滚动的collectionView:weekCollectionView 作为子视图。当我在 weekCollectionView 中滚动时,我将如何禁用 panGesturemainCollectionView 滚动?

这是我的代码 -

mainCollectionView panGesture:

fileprivate func setupPanGesture() 
        panGesture = UIPanGestureRecognizer(target: self, action: #selector(panRight(sender:)))
        panGesture.delegate = self
        mainCollectionView.addGestureRecognizer(panGesture)
    

@objc func panRight(sender: UIPanGestureRecognizer) 
    let translation = sender.translation(in: mainCollectionView)
    let indexPath = NSIndexPath(item: 0, section: 0)
    if (mainCollectionView.cellForItem(at: indexPath as IndexPath) != nil) 
        if translation.x > 0 
            (UIApplication.shared.keyWindow?.rootViewController as? MasterViewController)?.handlePan(sender: sender)
            mainCollectionView.isScrollEnabled = false
         else if translation.y > 0 || translation.y < 0 
            panGesture.isEnabled = false
            mainCollectionView.isScrollEnabled = true
        
    
    if (mainCollectionView.cellForItem(at: indexPath as IndexPath) == nil) 
        panGesture.isEnabled = false
        mainCollectionView.isScrollEnabled = true
    
    panGesture.isEnabled = true
    mainCollectionView.isScrollEnabled = true


func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool 
    return true

【问题讨论】:

【参考方案1】:

实现 UIGestureRecognizerDelegate 到你的类

将手势委托设置为自身。

panGesture.delegate = self

添加这个委托功能

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool 
    if (gestureRecognizer is UIPanGestureRecognizer || gestureRecognizer is UIRotationGestureRecognizer) 
        return true
     else 
        return false
    

【讨论】:

以上是关于禁用 uicollectionview 水平滚动的外部平移手势的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式禁用 UICollectionView 中的垂直滚动

禁用 scrollViewDidScroll:滚动 UICollectionView 时 - iOS

如果用户正在滚动,则禁用 UICollectionView 中的自动滚动

UICollectionview 动态高度问题

滚动到 UICollectionView 中的下一个单元格

UICollectionView - 水平滚动,水平布局?