iOS14上带有PKCanvasView绘图的PDFViewGestureRecognizer

问题描述

用于将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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...