取消当前的长手势来拖动视图?
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
因此,由于移动是开始时距视图左角的距离,因此您只需在我们开始按下时保存该点,然后测量距离,然后简单地移动您的视图。
效果很好。
【讨论】:
以上是关于取消当前的长手势来拖动视图?的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI手势(Gesture)进阶 : 实现任意视图的长按惯性加速行为
SwiftUI手势(Gesture)进阶 : 实现任意视图的长按惯性加速行为