えっと、まず画像の上に図形を描画する必要がありますよね。とりあえずこんな感じでしょうか。
(Arrow と言いつつ単なる線ですが…。矢印にする方法はご自分で考えてください。)
swift
1struct Arrow {
2 let start: CGPoint
3 let end: CGPoint
4
5 func draw(path: inout Path) {
6 path.move(to: start)
7 path.addLine(to: end)
8 }
9}
10
11struct ContentView: View {
12 let arrow = Arrow(start: CGPoint(x: 50, y: 50), end: CGPoint(x: 250, y: 250))
13
14 var body: some View {
15 ZStack {
16 Image(systemName: "tortoise")
17 .resizable()
18 .scaledToFit()
19 .foregroundColor(.green)
20
21 Path(arrow.draw)
22 .stroke()
23 .foregroundColor(.red)
24 }
25 .frame(width: 300, height: 300)
26 .border(Color.black)
27 }
28}
ドラッグして線を引くには DragGesture を使います。指を動かすと onChanged が呼ばれるので、始点 (value.startLocation) と終点 (value.location) の間に線を引きます。
swift
1struct ContentView: View {
2 @State var currentArrow: Arrow?
3
4 var body: some View {
5 ZStack {
6 Image(systemName: "tortoise")
7 .resizable()
8 .scaledToFit()
9 .foregroundColor(.green)
10
11 if let arrow = currentArrow {
12 Path(arrow.draw)
13 .stroke()
14 .foregroundColor(.blue)
15 }
16 }
17 .frame(width: 300, height: 300)
18 .border(Color.black)
19 .gesture(
20 DragGesture(minimumDistance: 0.1)
21 .onChanged { value in
22 currentArrow = Arrow(start: value.startLocation, end: value.location)
23 }
24 )
25 }
26}
さらに、過去に引いた線を覚えておくにはそれを配列か何かで保持すると良いでしょう。
swift
1struct ContentView: View {
2 @State var arrows = [Arrow]()
3 @State var currentArrow: Arrow?
4
5 var body: some View {
6 ZStack {
7 Image(systemName: "tortoise")
8 .resizable()
9 .scaledToFit()
10 .foregroundColor(.green)
11
12 ForEach(0..<arrows.count, id: .self) { index in
13 Path(arrows[index].draw)
14 .stroke()
15 .foregroundColor(.red)
16 }
17
18 if let arrow = currentArrow {
19 Path(arrow.draw)
20 .stroke()
21 .foregroundColor(.blue)
22 }
23 }
24 .frame(width: 300, height: 300)
25 .border(Color.black)
26 .gesture(
27 DragGesture(minimumDistance: 0.1)
28 .onChanged { value in
29 currentArrow = Arrow(start: value.startLocation, end: value.location)
30 }
31 .onEnded { value in
32 arrows.append(Arrow(start: value.startLocation, end: value.location))
33 currentArrow = nil
34 }
35 )
36 }
37}
(ヒントになってなくてごめんなさい。)