声明确定滑动的方向

时间:2017-03-27 00:27:42

标签: ios swift

我有一个if语句检查我正在移动的对象的速度(图像)。声明的目的是阻止图像受影响的方式,一旦它这样做,它就会锁定X或Y平面,这样就可以平稳地左右移动,或者平滑的上下移动。

由于代码在下方(首先检查右移动,然后是左移,等等),如果你向左或向右移动,移动会更顺畅。然而,有时候,当试图向上或向下影响运动时,它会被锁定在左右运动中。我相信这是因为它首先在if语句中查看左右移动。如果我先上下移动以进行检查,则左右移动会变得不稳定。有更好的方法吗?

let velocity = recognizer.velocity(in: self.view)
if velocity.x > 75 {
    movingRight = true
    myBlocks[objectDragging].center.y = CGFloat(initPosy)
} else if velocity.x < -75 {
    movingLeft = true
    myBlocks[objectDragging].center.y = CGFloat(initPosy)
} else if velocity.y < -30 {
    movingUp = true
    myBlocks[objectDragging].center.x = CGFloat(initPosx)
} else {
    movingDown = true
    myBlocks[objectDragging].center.x = CGFloat(initPosx)
}

2 个答案:

答案 0 :(得分:2)

此问题的示例是当您向上移动并略微向右移动时,如下所示:x = 78, y = -450 这绝对是垂直移动的一个示例,但是为了让您的算法知道它,您需要比较velocity.xvelocity.y值。 更好的方法是检查哪个轴具有最高的速度绝对值。在你的情况下,它也需要缩放(水平移动的阈值是75,垂直移动的阈值是30)。

if abs(velocity.x) > abs(velocity.y * 2.5) {
    // this is horizontal movement
}
else {
    // this is vertical movement
}

答案 1 :(得分:1)

也许您应该首先检查哪个方向具有更大的幅度,然后确定其是正还是负。

let velocity = recognizer.velocity(in: self.view)
if abs(velocity.x) > abs(velocity.y) {
    //going left/right
    if velocity.x > 0 {
        movingRight = true
        myBlocks[objectDragging].center.y = CGFloat(initPosy)
    } else {
        movingLeft = true
        myBlocks[objectDragging].center.y = CGFloat(initPosy)
    }
} else {
    if velocity.y > 0 {
        movingUp = true
        myBlocks[objectDragging].center.x = CGFloat(initPosx)
    } else {
        movingDown = true
        myBlocks[objectDragging].center.x = CGFloat(initPosx)
    }
}

正如@johnyu建议的那样 - 您可以使用一个因子来比较水平运动与垂直运动。