【问题标题】:Activate UIPanGestureRecognizer After A UILongTapGestureRecgonizer在 UILongTapGestureRecgonizer 之后激活 UIPanGestureRecognizer
【发布时间】:2015-01-05 22:48:08
【问题描述】:

我在 UIView 对象上有一个 UILongGestureRecognizer。

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

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

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

我希望用户按住手指,创建框,然后拖动该框(而不必再次点击框然后开始拖动它)。

如果在创建 UIView 时,您知道如何预激活 UIPanGestureRecognizer 以从顶部的手指按下开始?

这是我的拖动视图代码

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 应该处理拖动。

标签: ios swift uiview uipangesturerecognizer


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-07-30
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 2017-09-26
    • 1970-01-01
    • 2011-06-28
    • 2019-09-13
    相关资源
    最近更新 更多