【问题标题】: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 

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

【问题讨论】:

    标签: ios swift


    【解决方案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
        }
    

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

    效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多