UICollectionView 子视图平移移动而不滚动

Posted

技术标签:

【中文标题】UICollectionView 子视图平移移动而不滚动【英文标题】:UICollectionView subview pan move without scrolling 【发布时间】:2018-05-23 18:13:55 【问题描述】:

我有一个集合视图子视图的视图。如果我平移那个视图,我想移动那个视图。但是会发生什么是集合视图滚动一点,直到我在手势开始事件中关闭滚动。所以我试过不只是跳过这样的集合视图平移的触摸事件:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool 
    if gestureRecognizer == collectionView!.panGestureRecognizer && item.frame.contains(touch.location(in: self.collectionView!)) == true 
        return false
    
    return true

但问题仍然存在,集合视图仍在滚动..

【问题讨论】:

您可以尝试在CollectionView 上将UserInteractionEnabled 设置为false 【参考方案1】:

UICollectoinView 是 UIScrollView 的子类,尝试探索解决 UIScrollView 上的多手势的帖子,您可以从这里开始:

ScrollView gesture recognizer eating all touch events

【讨论】:

【参考方案2】:

好的,所以最终这样做(不确定这是否是最佳答案,但至少它有效):

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

        if let panGesture = gestureRecognizer as? UIPanGestureRecognizer, let otherPanGesture = otherGestureRecognizer as? UIPanGestureRecognizer 
            if panGesture == self.collectionView?.panGestureRecognizer && item.frame.contains(otherPanGesture.location(in: self.collectionView!)) == true ||
                otherPanGesture == self.collectionView?.panGestureRecognizer && item.frame.contains(panGesture.location(in: self.collectionView!)) == true 
                return false
            
            return true
        

【讨论】:

以上是关于UICollectionView 子视图平移移动而不滚动的主要内容,如果未能解决你的问题,请参考以下文章

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

按下按钮(子视图)时不要在超级视图上处理平移手势

网格视图(UICollectionView)的偏移量随着分页滚动而逐渐移动

如何使集合视图响应其自身视图之外的平移手势

UIScrollView 放大时用 1 根手指平移

UICollectionView 中的长按和平移手势