Представление TableView имеет DragGesture который позволяет перемещать представление вокруг ScrollView.
Я хочу нарисовать линию между двумя представлениями TableView, и для этого мне нужно получить доступ к смещению, хранящемуся в таблице , но когда я пытаюсь получить к ней доступ из TouchModelerContentView, она возвращает смещение как (0, 0), несмотря на то, что я перетащил таблицы на экран.
TouchModelerContentView
Код: Выделить всё
ScrollView {
ZStack {
ForEach($tables) { $table in
TableView(table: $table)
}
ForEach(tables) { table in
ForEach(table.relations) { relation in
Path { path in
path.move(to: CGPoint(x: relation.source.offset.width, y: relation.source.offset.height))
path.addLine(to: CGPoint(x: relation.target.offset.width, y: relation.target.offset.height))
print("\(relation.source.name) \(relation.source.offset) -> \(relation.target.name) \(relation.target.offset)") // Prints "Table2 (0.0, 0.0) -> Table1 (0.0, 0.0)"
}
}
}
}
}
Код: Выделить всё
struct Table: Identifiable {
struct Relation: Identifiable {
let id = UUID()
let source: Table
let target: Table
}
let id = UUID()
let name: String
var relations = [Relation]()
var startingOffset: CGSize = .zero
var currentOffset: CGSize = .zero
var offset: CGSize {
CGSize(width: startingOffset.width + currentOffset.width, height: startingOffset.height + currentOffset.height)
}
}
Код: Выделить всё
struct TableView: View {
@Binding var table: Table
var body: some View {
VStack {
...
}
.offset(table.offset)
.gesture(
DragGesture()
.onChanged { gesture in
table.currentOffset = gesture.translation
}
.onEnded{ gesture in
table.startingOffset.width += table.currentOffset.width
table.startingOffset.height += table.currentOffset.height
table.currentOffset = .zero
}
)
}
}
Код: Выделить всё
TableView
Подробнее здесь: https://stackoverflow.com/questions/782 ... -read-as-0