在 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
方法与相同的手势。之后,即使用户抬起手指并再次平移,子视图也会从自己接收的新平移手势识别器中收集数据。应该够简单了。
我在 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
方法与相同的手势。之后,即使用户抬起手指并再次平移,子视图也会从自己接收的新平移手势识别器中收集数据。应该够简单了。