首页 > 解决方案 > PDFView with PKCanvasView drawingGestureRecognizer on iOS14

问题描述

PKCanvasView添加到的最小代码PDFView。如果设置PKCanvasView了,则正确显示PKDrawing。但是在 iOS14 上,drawingGestureRecognizer不会触发。适用于iOS13

import UIKit
import PDFKit
import PencilKit

class ViewController: UIViewController {

    
    @IBOutlet var pdfView: PDFView!
    var scrollView : UIScrollView!
    var pkView : PKCanvasView!
    var docView : UIView!
    var drawing : PKDrawing!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        setupPDF()
        setupPencil()
    }
    
    func setupPDF() {
        let fileURL = Bundle.main.url(forResource: "test", withExtension: "pdf")!
        let pdfDocument = PDFDocument(url: fileURL)
        pdfView.document = pdfDocument
    }
    
    func setupPencil() {
        for scroll in self.allSubViews(in: self.pdfView, ofType: UIScrollView.self) {
            self.scrollView = scroll
            break
        }
        
        for view in self.allSubViews(in: self.scrollView, ofType: UIView.self) {
            if "\(view)".starts(with: "<PDFDocumentView: ") {
                self.docView = view
                break
            }
        }

        self.pkView = PKCanvasView(frame: CGRect(origin: CGPoint.zero, size: self.docView.bounds.size))
        self.pkView.isOpaque = false
        self.pkView.backgroundColor = .clear
        
        self.docView.addSubview(self.pkView)
        self.pkView.tool = PKInkingTool(.pen, color: .black, width:0.4)
        
        self.pkView.overrideUserInterfaceStyle = .light
        
        if let _drawing = self.drawing {
            self.pkView.drawing = _drawing
        }
        
        self.scrollView.panGestureRecognizer.minimumNumberOfTouches = 2
        self.scrollView.addGestureRecognizer(self.pkView.drawingGestureRecognizer)
    }


    func allSubViews<T: UIView>(in view:UIView, ofType type: T.Type) -> [T] {
        var all: [T] = []
        func getSubview(view: UIView) {
            if let aView = view as? T {
                all.append(aView)
            }
            guard view.subviews.count > 0 else { return }
            view.subviews.forEach{ getSubview(view: $0) }
        }
        getSubview(view: view)
        return all
    }
}

仅供参考,页面是动态呈现的,可以从层次结构中添加和删除。如果您使用此代码,则需要bringSubviewToFront在页面更改时使用。

标签: iosswiftpdfviewpencilkit

解决方案


推荐阅读