取消当前的长手势来拖动视图?

Posted

技术标签:

【中文标题】取消当前的长手势来拖动视图?【英文标题】:Canceling current long gesture to drag a view? 【发布时间】:2016-12-24 16:45:57 【问题描述】:

我有controllerA,我添加了一些UIView 子类。 这个视图里面有一个long press gesture,所以当你长按它时,它会委托给controllerA

现在,用户长按该视图时,我想通过添加到 controllerA 的 panGesture 开始拖动它(在 controllerA 中)。

唯一的问题是,当前在该视图(在其类中)上的长按正在消除 controllerA 的平移手势。(我只能在移开手指时拖动它)

在做:

view.userInteractionEnable=false 

长按开始后 - 不会取消触摸并让我拖动,除非我移开手指,否则我无法找到取消当前手势的方法。

【问题讨论】:

【参考方案1】:

如果我理解正确,请使用此函数并为您的识别器返回所需的状态:

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

【讨论】:

谢谢,所以我尝试将它添加到两个类中,但没有成功。我认为问题在于上层视图不会被子视图(长按)从他身上拿走【参考方案2】:

我发现了一个更简单的策略。 如果要在长按时开始拖动元素,则不需要使用平移手势。

您可以简单地设置长按并将allowableMovement 设置为较大的值,然后将移动转换为视图轴:

   let long:UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(self.long))
        long.allowableMovement=3000
        view.addGestureRecognizer(long)

然后你翻译坐标:

      let point = obj.location(in: view.superview)
   if(action == "began")draggedPoint = point //save starting point
    if(action == "changed")
    
        view.frame.origin.x+=point.x-draggedPoint.x //translate to our view and drag
        view.frame.origin.y+=point.y-draggedPoint.y
        isDragging=true
    

因此,由于移动是开始时距视图左角的距离,因此您只需在我们开始按下时保存该点,然后测量距离,然后简单地移动您的视图。

效果很好。

【讨论】:

以上是关于取消当前的长手势来拖动视图?的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 中的长按和平移手势

SwiftUI手势(Gesture)进阶 : 实现任意视图的长按惯性加速行为

SwiftUI手势(Gesture)进阶 : 实现任意视图的长按惯性加速行为

SwiftUI手势(Gesture)进阶 : 实现任意视图的长按惯性加速行为

禁用 UIScrollView 手势

在旋转视图上调整拖动手势