#swift #swiftui
#swift #swiftui
Вопрос:
В ZStack у меня есть ForEach
цикл для вставки некоторых фигур SkinShape
:
Struct Canvas: View {
@ObservedObject var glyphModel: GDGlyphViewModel
@Binding var tool: GDEditorTool
@Binding var selectedObject: UUID?
var body: some View {
ScrollView([.vertical, .horizontal], showsIndicators: true) {
GeometryReader { geometry in
ZStack {
mouseReader(geometry: geometry)
ForEach(glyphModel.glyph?.originControls ?? []) { control in
SkinShape(control: control).stroke()
}
ForEach(glyphModel.positionBinders.indices, id:.self) { index in
PointShape(point: position(index))
.foregroundColor( isSelected(index: index)
? .blue : .gray)
.....
И снаружи:
struct SkinShape: Shape {
@State var control : GDOriginControl
func path(in rect: CGRect) -> Path {
return Path { path in
print ("Making Shape (control.id)")
for index in 0..<control.origin.sticks.count-1 {
print (control.origin.sticks[index].offset.cgPoint)
let this = control.origin.sticks[index].offset.cgPoint
path.move(to: control.point.cgPoint this)
let next = control.origin.sticks[(index 1)].offset.cgPoint
path.addLine(to: control.point.cgPoint next)
}
}
}
}
Но форма никогда не меняется во время перерисовки. В консоли я вижу числовые изменения, все, кроме SkinShape
обновленного, glyphModel.objectWillChange.send()
запускается с помощью перетаскивания, я могу перемещать точки и изменять данные формы. Но формы никогда не меняются, обновляются только при замене содержимого GDGlyphViewModel
. Как заставить эти фигуры читать их данные и перерисовывать?
Ответ №1:
Вам не нужна оболочка состояния в форме (она не изменяется внутри, но предотвращает изменения извне):
struct SkinShape: Shape {
var control : GDOriginControl // << no state here !!
// .. other code
}