我正在尝试沿此木板线移动一个红点:
红点是Dot类的一个实例,该类是UIImage视图的子类:
class Dot: UIImageView {
enum directions {
case up, down, left, right, nordWest, nordEst, southWest, southEst
}
var position: Int = 4
var possibleDirections: [directions] {
switch position {
case 0:
return [.right, .down, .southEst]
case 1:
return [.left, .right, .down]
case 2:
return [.left, .down, .southWest]
case 3:
return [.up, .down, .right]
case 4:
return [.up, .down, .left, .right, .nordWest, .nordEst, .southWest, .southEst]
case 5:
return [.up, .down, .left]
case 6:
return [.up, .right, .nordEst]
case 7:
return [.up, .left, .right]
case 8:
return [.up, .left, .nordWest]
default:
return []
}
}
}
这是我的viewController:
@IBOutlet weak var redDot: Dot!
override func viewDidLoad() {
super.viewDidLoad()
redDot.isUserInteractionEnabled = true
let panGesture = UIPanGestureRecognizer(target: self, action: #selector( moveDot(_:) ))
redDot.addGestureRecognizer(panGesture)
}
@objc func moveDot(_ sender: UIPanGestureRecognizer) {
switch sender.state {
case .began, .changed:
moveDotWith(gesture: sender)
case .ended, .cancelled:
proceedToMove()
default:
break
}
}
private func moveDotWith(gesture: UIPanGestureRecognizer) {
let translation = gesture.translation(in: redDot)
let transform = CGAffineTransform(translationX: translation.x, y: translation.y)
redDot.transform = transform
}
private func proceedToMove() {
}
我想排序一下,moveDotWith(gesture)函数仅允许将点移动到以下行,然后procedToMove函数将使用redDot.position = (Int)
保存更改。
我认为我能够保存更改,但是我不知道如何使红点跟随线条,因此只能沿允许的方向前进。
位置从0到8,像这样:
我希望用户不能将点沿着空白线拖到空白区域,然后如果用户释放点,则点会移到最近的点。
例如:红点为1,如果用户尝试将其拖到3,则什么也没有发生。如果用户将其拖动到2,则该点跟随灰线,然后在用户释放它时,如果该点超过该行的一半,则变为2,否则返回到1。
答案 0 :(得分:0)
这将需要一些数学工作,但是只有一种方法...
将“ possibleDirections”更改为“ possibleEndPoints”:
var possibleEndPoints: [Int] {
switch position {
case 0:
return [1, 3, 4]
case 1:
return [0, 2, 4]
case 2:
return [1, 4, 5]
case 3:
return [0, 4, 6]
case 4:
return [0, 1, 2, 3, 5, 6, 7, 8]
case 5:
return [2, 4, 8]
case 6:
return [3, 4, 7]
case 7:
return [4, 6, 8]
case 8:
return [4, 5, 7]
default:
return []
}
}
现在,当用户拖动时,您将需要计算到与拖动点垂直的线上的点的距离:
所以
position
== 0 possibleEndPoints
== [1, 3, 4]
DP
是拖动点A
是在线0 -> 1
上的点B
是在线0 -> 4
上的点C
是在线0 -> 3
上的点最短的线将是有效线段的“最近点”,因此您应将redDot
移动到该点-在本例中为A
。当用户抬起手指时,计算出“是A
到达1
的50%以上的距离”。
随着用户继续拖动,您可能会到达:
现在B
是最接近拖动点的点,因此将redDot
移到B
。当用户抬起手指时,计算出“是B
到达4
的50%以上的距离”。
您必须考虑用户将 past 拖到有效点的情况,例如:
您必须想出自己的逻辑来决定redDot
的去向。