Использование SwiftUI для аннотирования наложения с существующим содержимым, отображаемым под представлением "Путь"

У меня есть приложение SwiftUI, в котором пользователю предоставляется некоторый контент, а затем пользователь будет комментировать его с помощью Path Посмотреть.

Проблема, с которой я столкнулся, заключается в том, что когда я использую чистый фон для представления рисования или вообще не использую фон, содержимое под ним будет отображаться по желанию, но изменения жеста для действия рисования не регистрируются.

Если же я назначу фону нечеткий цвет, то жест меняет регистр и появляется рисунок.

FWIW, мне удалось добиться желаемого эффекта с помощью UIKit основанный на интерфейсе, и я просто хотел бы воссоздать его с помощью SwiftUI сейчас.

Упрощенный код ниже - это полный пример, демонстрирующий мое затруднительное положение. Это всего лишь приблизительное значение используемого кода, так что это не совсем качество продукции.

Путем изменения backgroundColor к clear или комментируя .background(self.backgroundColor) линия, BackgroundView теперь появится, но onChanged не вызывается, поэтому чернила не появляются.

Если я бегу как есть, чернила появятся, но я не вижу BackgroundView.

import SwiftUI

struct ContentView: View {
    var body: some View {
        GeometryReader { geometry in
            ZStack {
                DrawingView(backgroundColor: .white,
                            geometry: geometry)
                    .zIndex(1)

                BackgroundView()
            }
        }
    }
}

struct DrawingView: View {
    let backgroundColor: Color
    let geometry: GeometryProxy
    
    @State private var points = [CGPoint]()
    
    var body: some View {
        Path { path in
            guard !points.isEmpty else  { return }
            
            for index in 0..<points.count - 1 {
                path.move(to: points[index])
                path.addLine(to: points[index + 1])
            }
        }
        .stroke(Color.red, lineWidth: 3.0)
        .background(self.backgroundColor)
        .gesture(DragGesture(minimumDistance: 0.1)
        .onChanged({ changeValue in
            print("onChanged called")
            self.points.append(changeValue.location)
        }))
    }
}

// Just a simple View to fill the background
struct BackgroundView: View {
    var body: some View {
        Color.black
            .edgesIgnoringSafeArea(.all)
    }
}

1 ответ

Решение

Вместо фона используйте.contentShape как

.stroke(Color.red, lineWidth: 3.0)
.contentShape(Rectangle())                    // << here !!
.gesture(DragGesture(minimumDistance: 0.1)
.onChanged({ changeValue in
Другие вопросы по тегам