从平移手势切割对角线运动

Posted

技术标签:

【中文标题】从平移手势切割对角线运动【英文标题】:Cutting diagonal movement from pan gesture 【发布时间】:2017-02-26 22:41:46 【问题描述】:

我正在尝试将我正在拖动的图像 (objectDragging) 锁定到 x 或 y 中心,这取决于我移动或影响它移动的方式。如果我将其影响到右侧,我希望它锁定其初始 Y 位置,并且只允许它向右移动(或向左移动,在一条直线上)。如果我向上影响它,请锁定它的 x 位置并让它在准确的线上直线向上或向下移动。我正在使用一个开关来处理我的运动,在 .end 情况下有很多代码,所以我不想包含很多代码。只是希望有一个想法 - 没能找到很多。

    switch(recognizer.state) 

    objectDragging = (recognizer.view?.tag)!

    case .began:

        initPosx = Int(recognizer.view!.center.x)
        initPosy = Int(recognizer.view!.center.y)
    case .changed:
        ...

【问题讨论】:

你还没有说清楚你想做什么。您是否希望能够自动确定用户是在做主要是上下手势还是主要是左右手势,然后将移动锁定到该维度?还是有其他因素决定用户是左右移动还是上下移动对象? 抱歉,我的帖子有点含糊。我所有的图像都是 UserInteractionEnabled 并且可以移动到您将它们拖动到的任何位置。我想确定用户开始拖动它们的方式,然后将其锁定在该方向或该平面上的直线上。类似于移动集合视图单元格。 您可以尝试检查初始 velocity 并确定它是大部分水平还是大部分垂直平移,然后设置一个标志,以便您可以在以后的平移事件中忽略其中一个轴。 Velocity 似乎可以帮助我获取信息。谢谢 【参考方案1】:

在使用Paulw11 中的velocity 的建议之后,我通过决定我们最初移动图像的方式(在.began 中)然后锁定x,成功地限制了我正在移动的图像的方向或 y(在 .changed 中)。万一有人遇到类似问题,以下是适用于我的应用程序的解决方案的要点:

switch(recognizer.state) 
case .began:
let velocity = recognizer.velocity(in: self.view)
if (velocity.x > velocity.y) && (velocity.x > 0) 
            print("moving right")
            myBlocks[objectDragging].center.y = CGFloat(initPosy)
            movingRight = true
        
        else if ((abs(velocity.x)) > velocity.y) && (velocity.x < 0) 
            print("moving left")
            myBlocks[objectDragging].center.y = CGFloat(initPosy)
            movingLeft = true
        
        else if (velocity.y > velocity.x) && (velocity.y > 0) 
            print("moving down")
            myBlocks[objectDragging].center.x = CGFloat(initPosx)
            movingDown = true
        
        else if ((abs(velocity.y)) > velocity.x) && (velocity.y < 0)
            print("moving up")
            myBlocks[objectDragging].center.x = CGFloat(initPosx)
            print(abs(velocity.y))
            movingUp = true
        


    case .changed:

        if (movingRight == true) 
            myBlocks[objectDragging].center.y = CGFloat(initPosy)
        
        else if (movingLeft == true) 
            myBlocks[objectDragging].center.y = CGFloat(initPosy)
        
        else if (movingDown == true) 
            myBlocks[objectDragging].center.x = CGFloat(initPosx)
        
        else if (movingUp == true) 
            myBlocks[objectDragging].center.x = CGFloat(initPosx)
        

    case .ended:

        movingUp = false
        movingLeft = false
        movingRight = false
        movingDown = false

【讨论】:

以上是关于从平移手势切割对角线运动的主要内容,如果未能解决你的问题,请参考以下文章

如何创建对角线切割视图以在配置文件屏幕中使用?

为啥这段代码不检测对角线运动?

对角线运动

python控制窗口对角线运动

约束 UIScrollView 平移?

pygame中奇怪的矢量运动