【问题标题】:How to use PKToolPicker with PKCanvasView in SwiftUI如何在 SwiftUI 中使用 PKToolPicker 和 PKCanvasView
【发布时间】:2020-09-23 00:33:12
【问题描述】:

目前,我可以有一个单独的PKCanvasView 和一个PKToolPicker,当点击按钮时会显示。但是,该工具不会在选取器和画布视图之间传输。有谁知道如何将两者链接起来,这样当我在选择器中更改工具时,该工具也会在画布视图中更新?我在下面附上了我的代码。谢谢!

import SwiftUI
import PencilKit

struct DrawingView: View {
    @State private var showPicker = false
    @State private var canvasView = PKCanvasView()
    var body: some View {
        VStack {
            PencilKitView(isActive: $showPicker, canvasView: $canvasView)
            Button("Picker") { self.showPicker.toggle() }
        }
    }
}

struct PencilKitView: UIViewRepresentable {
    typealias UIViewType = PKCanvasView
    @Binding var isActive: Bool
    @Binding var canvasView: PKCanvasView

    let coordinator = Coordinator()
    
    class Coordinator: NSObject, PKToolPickerObserver {
        
        func toolPickerSelectedToolDidChange(_ toolPicker: PKToolPicker) {
            // some code
        }
        func toolPickerVisibilityDidChange(_ toolPicker: PKToolPicker) {
            // some code
        }
        
    }
    
    func makeCoordinator() -> PencilKitView.Coordinator {
        return Coordinator()
    }
    
    func makeUIView(context: Context) -> PKCanvasView {
        canvasView
    }
    
    func updateUIView(_ uiView: PKCanvasView, context: Context) {
        uiView.isOpaque = true
        uiView.becomeFirstResponder()

        let toolPicker = PKToolPicker.init()
        toolPicker.addObserver(uiView)
        toolPicker.addObserver(coordinator)
        toolPicker.setVisible(isActive, forFirstResponder: uiView)
        
        DispatchQueue.main.async {
            uiView.becomeFirstResponder()
        }
    }
}

【问题讨论】:

    标签: ios swift swiftui uiviewrepresentable pencilkit


    【解决方案1】:

    解决了!

    import SwiftUI
    import PencilKit
    
    struct DrawingView: View {
        private var canvasView = PKCanvasView()
    
        var body: some View {
            MyCanvas(canvasView: canvasView)
        }
    }
    
    struct MyCanvas: UIViewRepresentable {
        var canvasView: PKCanvasView
        let picker = PKToolPicker.init()
        
        func makeUIView(context: Context) -> PKCanvasView {
            self.canvasView.tool = PKInkingTool(.pen, color: .black, width: 15)
            self.canvasView.becomeFirstResponder()
            return canvasView
        }
        
        func updateUIView(_ uiView: PKCanvasView, context: Context) {
            picker.addObserver(canvasView)
            picker.setVisible(true, forFirstResponder: uiView)
            DispatchQueue.main.async {
                uiView.becomeFirstResponder()
            }
        }
    }
    
    

    【讨论】:

    • PKCanvasView使用State/Binding是没有意义的,因为它是一个指针,你可以直接传递它。
    • 我是 IOS 开发新手,能否拥有 Objective C 版本?
    • 对不起@Renascent,但上面的代码依赖于SwiftUI框架,它只是Swift。
    • @HeySaiK 很不幸。无论如何,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    相关资源
    最近更新 更多