在 UILongTapGestureRecgonizer 之后激活 UIPanGestureRecognizer

Activate UIPanGestureRecognizer After A UILongTapGestureRecgonizer

我在 UIView 对象上有一个 UILongGestureRecognizer。

当用户按住手指 1 秒时,我在他们按住手指的位置绘制另一个 UIView(一个彩色框)。

这个新绘制的 UIView 附加了一个 UIPanGestureRecognizer。

但是,为了让 UIPanGestureRecognizer 开始,需要重新点击屏幕。似乎如果我的手指已经按下,它不会开始接收输入,直到我再次按下它。

我希望用户按住他们的手指,创建框,然后四处拖动该框(而不是必须再次点击框然后开始四处拖动)。

你知道我如何预激活 UIPanGestureRecognizer 以在创建 UIView 时从手指按下开始吗?

这是我的拖动视图代码

public func performDrag(recoginizer:UIPanGestureRecognizer)
    {
        if(!_drag)
        {
            return
        }
        let point = recoginizer.translationInView(_dragView!)
        switch(recoginizer.state)
        {
            case UIGestureRecognizerState.Began:
                _initialPositionBeforeDragStarted = CGPoint(x: self.frame.origin.x, y: self.frame.origin.y)
            case UIGestureRecognizerState.Ended:
                _initialPositionBeforeDragStarted = nil
                if(_didMoveFinishedCallback != nil)
                {
                    _didMoveFinishedCallback()
                    return
                }
            case UIGestureRecognizerState.Changed:
                frame.origin.x = _initialPositionBeforeDragStarted.x + point.x
                if (frame.origin.x + frame.width > _dragView!.frame.width)
                {
                    frame.origin.x = _dragView!.frame.width - frame.width
                }
                if(frame.origin.x < 0)
                {
                    frame.origin.x = 0
                }
                frame.origin.y = _initialPositionBeforeDragStarted.y + point.y
                if (frame.origin.y + frame.height > _dragView!.frame.height)
                {
                    frame.origin.y = _dragView!.frame.height - frame.height
                }
                if(frame.origin.y < 0)
                {
                    frame.origin.y = 0
                }
            default:
                println("Error: Default hit in perform drag")
        }

        if(_didMoveCallback != nil)
        {
            var globalPoint = window!.convertPoint(frame.origin, fromView: self.superview)
            _didMoveCallback(globalPoint)
        }
    }

正如评论中已经建议的那样,UILongPressGestureRecognizer 应该处理拖动。识别此手势后,它实际上与平移手势识别器完全一样。

因此,例如,如果您的超级视图处理长按方法,您需要做的就是在状态开始时创建子视图(就像您已经做的那样)并在相同的方法中调用子视图 performDrag 方法与相同的手势。之后,即使用户抬起手指并再次平移,子视图也会从自己接收的新平移手势识别器中收集数据。应该够简单了。