Я хотел бы реализовать перетаскивание по кругу в SwiftUI, но я не уверен в лучшем способе go.
Вот базовый c код перетаскивания - есть один маленький перетаскиваемый круг, который я хотел бы ограничить границами большего круга во время фазы updating
DragGesture. В настоящий момент черный круг перетаскивается по всему виду.
import SwiftUI
struct ContentView: View {
@State private var position = CGSize.zero
@GestureState var dragOffset: CGSize = .zero
private var dragRadius: CGFloat = 200.0
var body: some View {
ZStack {
Circle()
.fill(Color.red)
.frame(width: dragRadius, height: dragRadius)
Circle()
.fill(Color.black)
.frame(width: dragRadius / 4, height: dragRadius / 4)
.offset(x: position.width + dragOffset.width, y: position.height + dragOffset.height)
.gesture(
DragGesture()
.updating($dragOffset, body: { (value, state, transaction) in
// Need to clamp to circular bounds here??
state = value.translation
})
.onEnded({ (value) in
self.position.height += value.translation.height
self.position.width += value.translation.width
})
)
}
}
}
Интересно, это случай использования тригонометрии и полярных координат для вычисления расстояния от центра и ограничения радиуса в направление перетаскиваемого круга, или есть более простой способ заставить SwiftUI «видеть» круговые границы вида?