xcode 在多个文件上选择CanvasView工具

qzwqbdag  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(108)

我有四个文件。在PKCanvasRepresentation.swift中,我只初始化画布视图。在CanvasView.swift中,我使用初始化,并希望通过NoteToolbarView.swift中的给定选择来分配各个工具。在NoteToolbarView中,我构建了一个用于选择工具的按钮的概述。最后,我将CanvasView和NoteToolbarView合并到NoteView.swift中。我的问题是我还没有找到一种方法来将选择从NoteToolbarView.swift传递到CanvasView.swift。

import SwiftUI
import PencilKit

struct PKCanvasRepresentation: UIViewRepresentable {
    @Binding var canvasView: PKCanvasView
    
    func makeUIView(context: Context) -> PKCanvasView {
        canvasView.isOpaque = false
        canvasView.tool = PKInkingTool(.pen, color: .black, width: 5)
        canvasView.drawingPolicy = .anyInput

        return canvasView
    }
    func updateUIView(_ uiView: PKCanvasView, context: Context) {
        
    }
    }

x

import SwiftUI
import PencilKit

struct CanvasView: View {
    @State private var canvasView = PKCanvasView()
    @Binding private var selectedTool: String
    
    public init(selectedTool: Binding<String>) {
            self._selectedTool = selectedTool
        }
   
    var body: some View {
        ZStack {
            Color.white
            PKCanvasRepresentation(canvasView: $canvasView)
                .padding(.all, 20)
                .background(Color.mint)
        }
        .onAppear {
            setTool()
        }
    }
    
    func setTool() {
        switch selectedTool {
        case "pen":
            canvasView.tool = PKInkingTool(.pen, color: .black, width: 5)
        case "eraser":
            canvasView.tool = PKEraserTool(.vector)
        default :
            canvasView.tool = PKInkingTool(.pen, color: .red, width: 5)
        }
    }
}

struct CanvasView_Previews: PreviewProvider {
    static var previews: some View {
        CanvasView(selectedTool: .constant("pen"))
    }
}
import SwiftUI
import PencilKit

struct NoteToolbarView: View {
    @Environment(\.presentationMode) var presentationMode
    
    @Binding var selectedTool: String
    
    @State private var pencilPressed = false
    @State private var eraserPressed = false
    @State private var settingPressed = false
    @State private var eraserImage = "eraser"
    @State private var pencilWeight: Font.Weight = .medium
    @State private var eraserWeight: Font.Weight = .medium
    @State private var settingWeight: Font.Weight = .medium
    
    var body: some View {
       
        VStack(alignment: .leading) {
            HStack(alignment: .center) {
                Button {
                    reset(trigger: "default")
                    presentationMode.wrappedValue.dismiss()
                    
                } label: {
                    Image(systemName: "arrowshape.turn.up.left")
                }
                Button(action: {
                    if pencilPressed {
                        PencilSecondPressed()
                        
                    } else {
                        PencilFirstPressed()
                       reset(trigger: "pencil")
                        selectedTool = "pen"
              
                    }
                }) {
                    Image(systemName: "applepencil")
                        .fontWeight(pencilWeight)
                }
                Button(action: {
                    if eraserPressed {
                        PencilSecondPressed()
                    } else {
                        PencilFirstPressed()
                        reset(trigger: "eraser")
                        selectedTool = "eraser"
                    }
                }) {
                    Image(systemName: eraserImage)
                        .fontWeight(eraserWeight)
                }
               
                Text("Notes")
                    .frame(maxWidth: .infinity, alignment: .center)
                
                Button(action: {
                    if settingPressed {
                        PencilSecondPressed()
                    } else {
                        PencilFirstPressed()
                        reset(trigger: "setting")
                    }
                }) {
                    Image(systemName: "doc.badge.plus")
                        .fontWeight(settingWeight)
                        .frame( alignment: .trailing)
                }
                Button(action: {
                    if settingPressed {
                        PencilSecondPressed()
                    } else {
                        PencilFirstPressed()
                        reset(trigger: "setting")
                    }
                }) {
                    Image(systemName: "list.dash")
                        .fontWeight(settingWeight)
                        .frame( alignment: .trailing)
                }
            }
            .frame(height: 40)
            .foregroundColor(Color.green)
            .padding(.leading, 30)
            .padding(.trailing, 30)
            .imageScale(.large)
            
            Divider()
        }
    }
    
    func reset(trigger: String) {
        switch trigger {
        case "pencil" :
            pencilWeight = .black
            pencilPressed = true
            eraserImage = "eraser"
            eraserWeight = .medium
            eraserPressed = false
            settingWeight = .medium
            settingPressed = false
        case "eraser" :
            pencilWeight = .medium
            pencilPressed = false
            eraserImage = "eraser.fill"
            eraserWeight = .black
            eraserPressed = true
            settingWeight = .medium
            settingPressed = false
        case "setting" :
            pencilWeight = .medium
            pencilPressed = false
            eraserImage = "eraser"
            eraserWeight = .medium
            eraserPressed = false
            settingWeight = .black
            settingPressed = true
        default:
            pencilWeight = .medium
            pencilPressed = false
            eraserImage = "eraser"
            eraserWeight = .medium
            eraserPressed = false
            settingWeight = .medium
            settingPressed = false
        }
        
    }
    
    func PencilFirstPressed() {
        print("first time")
    }
    func PencilSecondPressed() {
        print("second time")
    }
}

struct NoteToolbarView_Previews: PreviewProvider {
    static var previews: some View {
        NoteToolbarView(selectedTool: .constant("p"))
    }
}
import SwiftUI
import PencilKit

struct NoteView: View {
    @State private var selectedTool: String = "pen"
    @State private var screenWidth: CGFloat = UIScreen.main.bounds.width
    var body: some View {
            VStack {
                NoteToolbarView(selectedTool: $selectedTool) 
                    .frame(height: 40)
                CanvasView(selectedTool: $selectedTool) 
                    .frame(width: screenWidth - 60)
                    .padding(.all, 30)
            }
        }
    }

struct NoteView_Previews: PreviewProvider {
    static var previews: some View {
        NoteView()
    }
}

的数据
我不得不承认,我还没有找到一个合适的PencilKit指南,而且我在Swift编程世界里的时间也没有那么长。我试过几次用ChatGpt来帮助自己,但这并没有真正让我走得很远。

相关问题