在 WKWebView 之上叠加 PKCanvasView

问题描述 投票:0回答:1

我正在尝试将 Apple Pencil 与 WKWebView 集成。

期望的行为:

  • 使用铅笔可以让您在网页上绘制所有花哨的 PencilKit 集成(PKToolPicker 等)
  • 用手指滚动网页,滚动同步到webview。

拍摄2

所以在花了更多时间之后,我得出了一个非常 hacky 的解决方案,我实际上并不喜欢这个解决方案:

  • 在上面创建一个
    WKWebView
    和一个透明的
    PKCanvasView
  • 覆盖 `PKCanvasView 的
    hitTest
    以始终返回 nil。
  • 将PKCanvasView的
    drawingGestureRecognizer
    添加到
    WKWebView
  • 确保
    drawingGestureRecognizer.allowedTouchTypes = [NSNumber(value: UITouch.TouchType.pencil.rawValue)]
    设置为
    PKCanvasView

这种方法有效,但它消除了实施的大量灵活性。

取一

到目前为止,我已经尝试了两种方法:

  • 当我检测到它来自手指时,有选择地取消画布上的用户输入。这没有用,因为在事件被视图消耗之前我无法检测到这一点。

  • 创建一个透明的超级视图,并在我进行检测时为 PKCanvasView 和 WKWebView 手动调用 touchesBegan/touchesMoved/touchesEnded。不幸的是,这也不起作用,因为调用这些方法没有做任何事情。

这是我到目前为止的一些基本代码:

struct SUICanvasView: UIViewControllerRepresentable {
    let url: URL?
    func makeUIViewController(context: Context) -> ZRCanvasReader {
        let canvasReader = ZRCanvasReader()
        canvasReader.openUrl(url: url)
        return canvasReader
    }

    func updateUIViewController(_ uiViewController: ZRCanvasReader, context: Context) {

    }

    typealias UIViewControllerType = ZRCanvasReader
}

class ZRCanvasReader: UIViewController {
    lazy var canvas: PKCanvasView = {
        let v = PKCanvasView()
        v.isOpaque = false
        v.backgroundColor = .clear
        return v
    }()

    lazy var toolPicker: PKToolPicker = {
        let toolPicker = PKToolPicker()
        return toolPicker
    }()

    lazy var webView: WKWebView = {
        let prefs = WKWebpagePreferences()
        prefs.allowsContentJavaScript = true

        let config = WKWebViewConfiguration()
        config.defaultWebpagePreferences = prefs


        let webview = WKWebView(frame: .zero, configuration: config)
        return webview
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(webView)
        view.addSubview(canvas)

        webView.frame = view.frame
        canvas.frame = view.frame

        toolPicker.addObserver(canvas)
        toolPicker.setVisible(true, forFirstResponder: canvas)
    }

    func openUrl(url: URL?) {
        guard let loadingUrl = url else {
            return
        }
        let request = URLRequest(url: loadingUrl)
        webView.load(request)
    }
}
ios swift uikit webkit pencilkit
1个回答
0
投票
// Set PKCanvasView to same size as UIScrollView's content size
canvasView = PKCanvasView(frame: CGRect(origin: .zero, size: scrollView.contentSize))
scrollView.addSubview(canvasView)
// Disable UIScrollView scroll with one finger
scrollView.panGestureRecognizer.minimumNumberOfTouches = 2
© www.soinside.com 2019 - 2024. All rights reserved.