fix(worterbuch): blank screen when opening canvas
This commit is contained in:
@@ -29,23 +29,39 @@ struct FieldEditorView: View {
|
||||
let fieldType: FieldType
|
||||
|
||||
@State private var isRecognizing = false
|
||||
@State private var viewAppeared = false
|
||||
|
||||
var body: some View {
|
||||
NavigationView {
|
||||
VStack(spacing: 0) {
|
||||
// Handwriting canvas
|
||||
HandwritingCanvasView(
|
||||
drawing: $drawing,
|
||||
onDrawingChanged: { newDrawing in
|
||||
recognizeHandwriting(newDrawing)
|
||||
},
|
||||
isEditable: true
|
||||
)
|
||||
.frame(maxWidth: .infinity)
|
||||
.frame(height: 400)
|
||||
.background(Color(.systemGray6))
|
||||
.cornerRadius(12)
|
||||
.padding()
|
||||
if viewAppeared {
|
||||
HandwritingCanvasView(
|
||||
drawing: $drawing,
|
||||
onDrawingChanged: { newDrawing in
|
||||
recognizeHandwriting(newDrawing)
|
||||
},
|
||||
isEditable: true
|
||||
)
|
||||
.frame(maxWidth: .infinity)
|
||||
.frame(height: 400)
|
||||
.background(Color(.systemGray6))
|
||||
.cornerRadius(12)
|
||||
.padding()
|
||||
} else {
|
||||
// Placeholder while loading
|
||||
Rectangle()
|
||||
.fill(Color(.systemGray6))
|
||||
.frame(height: 400)
|
||||
.cornerRadius(12)
|
||||
.padding()
|
||||
.onAppear {
|
||||
// Show canvas after a brief delay to ensure window is ready
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) {
|
||||
viewAppeared = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Transcribed text section
|
||||
VStack(alignment: .leading, spacing: 8) {
|
||||
|
||||
@@ -22,15 +22,8 @@ struct HandwritingCanvasView: UIViewRepresentable {
|
||||
canvasView.backgroundColor = .clear
|
||||
canvasView.isUserInteractionEnabled = isEditable
|
||||
|
||||
// Use the shared tool picker and show it after a delay
|
||||
DispatchQueue.main.async {
|
||||
if isEditable, let window = canvasView.window {
|
||||
let toolPicker = PKToolPicker.shared(for: window)
|
||||
toolPicker?.setVisible(true, forFirstResponder: canvasView)
|
||||
toolPicker?.addObserver(canvasView)
|
||||
canvasView.becomeFirstResponder()
|
||||
}
|
||||
}
|
||||
// Store canvas in coordinator for later access
|
||||
context.coordinator.canvasView = canvasView
|
||||
|
||||
return canvasView
|
||||
}
|
||||
@@ -41,15 +34,9 @@ struct HandwritingCanvasView: UIViewRepresentable {
|
||||
}
|
||||
canvasView.isUserInteractionEnabled = isEditable
|
||||
|
||||
// Ensure tool picker is visible when editable
|
||||
if isEditable {
|
||||
DispatchQueue.main.async {
|
||||
if let window = canvasView.window {
|
||||
let toolPicker = PKToolPicker.shared(for: window)
|
||||
toolPicker?.setVisible(true, forFirstResponder: canvasView)
|
||||
canvasView.becomeFirstResponder()
|
||||
}
|
||||
}
|
||||
// Set up tool picker when window becomes available
|
||||
if isEditable && canvasView.window != nil && !context.coordinator.toolPickerSetup {
|
||||
context.coordinator.setupToolPicker()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,10 +47,32 @@ struct HandwritingCanvasView: UIViewRepresentable {
|
||||
class Coordinator: NSObject, PKCanvasViewDelegate {
|
||||
var drawing: Binding<PKDrawing>
|
||||
var onDrawingChanged: ((PKDrawing) -> Void)?
|
||||
var canvasView: PKCanvasView?
|
||||
var toolPicker: PKToolPicker?
|
||||
var toolPickerSetup = false
|
||||
|
||||
init(drawing: Binding<PKDrawing>, onDrawingChanged: ((PKDrawing) -> Void)?) {
|
||||
self.drawing = drawing
|
||||
self.onDrawingChanged = onDrawingChanged
|
||||
super.init()
|
||||
// Create a dedicated tool picker instance
|
||||
self.toolPicker = PKToolPicker()
|
||||
}
|
||||
|
||||
func setupToolPicker() {
|
||||
guard let canvasView = canvasView,
|
||||
let toolPicker = toolPicker,
|
||||
canvasView.window != nil,
|
||||
!toolPickerSetup else {
|
||||
return
|
||||
}
|
||||
|
||||
toolPickerSetup = true
|
||||
|
||||
// Set visible and add observer immediately
|
||||
toolPicker.setVisible(true, forFirstResponder: canvasView)
|
||||
toolPicker.addObserver(canvasView)
|
||||
canvasView.becomeFirstResponder()
|
||||
}
|
||||
|
||||
func canvasViewDrawingDidChange(_ canvasView: PKCanvasView) {
|
||||
|
||||
@@ -9,6 +9,12 @@ import SwiftUI
|
||||
import PencilKit
|
||||
import CoreData
|
||||
|
||||
struct FieldSelection: Identifiable {
|
||||
let id = UUID()
|
||||
let entry: VocabularyEntry
|
||||
let fieldType: FieldType
|
||||
}
|
||||
|
||||
struct VocabularyGridView: View {
|
||||
@Environment(\.managedObjectContext) private var viewContext
|
||||
@FetchRequest(
|
||||
@@ -18,13 +24,7 @@ struct VocabularyGridView: View {
|
||||
private var entries: FetchedResults<VocabularyEntry>
|
||||
|
||||
@State private var searchText = ""
|
||||
@State private var selectedEntry: VocabularyEntry?
|
||||
@State private var selectedFieldType: FieldType?
|
||||
@State private var showingFieldEditor = false
|
||||
|
||||
// Temporary bindings for editing
|
||||
@State private var editingDrawing: PKDrawing = PKDrawing()
|
||||
@State private var editingText: String = ""
|
||||
@State private var fieldSelection: FieldSelection?
|
||||
|
||||
var filteredEntries: [VocabularyEntry] {
|
||||
if searchText.isEmpty {
|
||||
@@ -111,16 +111,14 @@ struct VocabularyGridView: View {
|
||||
}
|
||||
}
|
||||
}
|
||||
.sheet(isPresented: $showingFieldEditor) {
|
||||
if let entry = selectedEntry, let fieldType = selectedFieldType {
|
||||
FieldEditorView(
|
||||
drawing: bindingForDrawing(entry: entry, fieldType: fieldType),
|
||||
text: bindingForText(entry: entry, fieldType: fieldType),
|
||||
fieldType: fieldType
|
||||
)
|
||||
.onDisappear {
|
||||
saveContext()
|
||||
}
|
||||
.sheet(item: $fieldSelection) { selection in
|
||||
FieldEditorView(
|
||||
drawing: bindingForDrawing(entry: selection.entry, fieldType: selection.fieldType),
|
||||
text: bindingForText(entry: selection.entry, fieldType: selection.fieldType),
|
||||
fieldType: selection.fieldType
|
||||
)
|
||||
.onDisappear {
|
||||
saveContext()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -128,9 +126,7 @@ struct VocabularyGridView: View {
|
||||
}
|
||||
|
||||
private func openFieldEditor(for entry: VocabularyEntry, fieldType: FieldType) {
|
||||
selectedEntry = entry
|
||||
selectedFieldType = fieldType
|
||||
showingFieldEditor = true
|
||||
fieldSelection = FieldSelection(entry: entry, fieldType: fieldType)
|
||||
}
|
||||
|
||||
private func bindingForDrawing(entry: VocabularyEntry, fieldType: FieldType) -> Binding<PKDrawing> {
|
||||
|
||||
Reference in New Issue
Block a user