Использование 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