У меня есть 2 независимых набора данных, один используется для рисования линии (a Path
), а другой используется для размещения небольшого вида где-то на линии (Circle)
.
Вы можно представить себе это как слайдер (на самом деле UX должен быть примерно таким)
Я хотел добавить жест перетаскивания на красный круг Просмотр, так что пользователь может перемещать его в любом месте между конечными точками линии. Но способ, которым я реализовал или думал, что он работает, совсем не работает или довольно плох.
Известный набор данных:
Для простоты примера я добавил несколько простых моментов, а именно Top
& Bottom
, но на самом деле то, чего я пытаюсь достичь, это установил sh периметр на слое карты, выбирая координаты широты и долготы, преобразуя его в пространство экранных координат и нанося Path
(линию) для этих двух точек, а затем предоставляя возможность пользователю маркировать периметр и предоставляя свободу перетаскивать его вдоль линии периметра в соответствии с потребностями пользователя. (Один ярлык на строку, без осложнений).
При этом Slider не был вариантом.
Что выглядит примерно так:
Пример кода:
struct TestView: View {
@State var position = CGPoint(x: 60, y: 60)
let top = CGPoint(x: 50, y: 50)
let bottom = CGPoint(x: 300, y: 300)
var body: some View {
ZStack {
Path { path in
path.move(to: self.top)
path.addLine(to: self.bottom)
}
.stroke(Color.red, lineWidth: 5)
Circle()
.foregroundColor(.red)
.frame(width: 20)
.position(self.position)
.gesture(
DragGesture(minimumDistance: 0, coordinateSpace: .global)
.onChanged { drag in
print(drag.location)
if
self.top.x <= drag.location.x,
self.bottom.x >= drag.location.x,
self.top.y <= drag.location.y,
self.bottom.y >= drag.location.y,
self.pointOnLine(point: drag.location)
{
self.position = drag.location
}
}
)
}
}
}
Вспомогательный метод для проверки, находится ли точка на линии :
func pointOnLine(point: CGPoint) -> Bool {
let dxc = point.x - top.x
let dyc = point.y - top.y
let dxl = bottom.x - top.x
let dyl = bottom.y - top.y
let cross = dxc * dyl - dyc * dxl
return cross == 0
}
Любая помощь приветствуется. Заранее спасибо.