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
在页面更改时使用。