Am Ende löste ich das Problem durch eine PDFViewController Klasse erstellen UIViewController und UIGestureRecognizerDelegate erstreckt. Ich habe ein PDFView als Unteransicht und ein UIBarButtonItem für das navigationItem hinzugefügt, das dazu dient, den Anmerkungsmodus umzuschalten.
ich die Noten in einem UIBezierPath aufnehmen signingPath genannt und habe die aktuelle Anmerkung in currentAnnotation vom Typ PDFAnnotation mit dem folgenden Code:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first {
let position = touch.location(in: pdfView)
signingPath = UIBezierPath()
signingPath.move(to: pdfView.convert(position, to: pdfView.page(for: position, nearest: true)!))
annotationAdded = false
UIGraphicsBeginImageContext(CGSize(width: 800, height: 600))
lastPoint = pdfView.convert(position, to: pdfView.page(for: position, nearest: true)!)
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first {
let position = touch.location(in: pdfView)
let convertedPoint = pdfView.convert(position, to: pdfView.page(for: position, nearest: true)!)
let page = pdfView.page(for: position, nearest: true)!
signingPath.addLine(to: convertedPoint)
let rect = signingPath.bounds
if(annotationAdded) {
pdfView.document?.page(at: 0)?.removeAnnotation(currentAnnotation)
currentAnnotation = PDFAnnotation(bounds: rect, forType: .ink, withProperties: nil)
var signingPathCentered = UIBezierPath()
signingPathCentered.cgPath = signingPath.cgPath
signingPathCentered.moveCenter(to: rect.center)
currentAnnotation.add(signingPathCentered)
pdfView.document?.page(at: 0)?.addAnnotation(currentAnnotation)
} else {
lastPoint = pdfView.convert(position, to: pdfView.page(for: position, nearest: true)!)
annotationAdded = true
currentAnnotation = PDFAnnotation(bounds: rect, forType: .ink, withProperties: nil)
currentAnnotation.add(signingPath)
pdfView.document?.page(at: 0)?.addAnnotation(currentAnnotation)
}
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first {
let position = touch.location(in: pdfView)
signingPath.addLine(to: pdfView.convert(position, to: pdfView.page(for: position, nearest: true)!))
pdfView.document?.page(at: 0)?.removeAnnotation(currentAnnotation)
let rect = signingPath.bounds
let annotation = PDFAnnotation(bounds: rect, forType: .ink, withProperties: nil)
annotation.color = UIColor(hex: 0x284283)
signingPath.moveCenter(to: rect.center)
annotation.add(signingPath)
pdfView.document?.page(at: 0)?.addAnnotation(annotation)
}
}
Die Anmerkung Umschaltknopf gerade läuft:
pdfView.isUserInteractionEnabled = !pdfView.isUserInteractionEnabled
Dies war wirklich der Schlüssel dazu, da dies das Scrollen auf der PDF-Datei deaktiviert und es mir ermöglicht, die Berührungsereignisse zu empfangen. Die Art und Weise, wie die Berührungsereignisse aufgezeichnet und in PDF konvertiert werden, bedeutet, dass die Anmerkung während des Schreibens auf der PDF-Datei sichtbar ist und dass sie schließlich an der richtigen Position im PDF-Dokument aufgezeichnet wird - unabhängig von der Bildlaufposition.
Sicherstellen, dass es auf der rechten Seite landet, ist nur eine Frage der ähnlichen Änderung der hartcodierten 0 für die Seitenzahl auf den Wert pdfView.page (für: Position, am nächsten: wahr).
Nicht sicher, dass der 'UIGraphicsBeginImageContext (CGSize (width: 800, height: 600))' in diesem Code tut. –
Entschuldigung, ich habe den Code zum Posten hier nicht vorbereitet - ich hatte das Gefühl, dass ich meinen Code jetzt aufsetzen musste, da andere Leute Interesse hatten, also enthält das Beispiel möglicherweise Code, der für das Beispiel hier nicht benötigt wird, aber da drin war für andere Zwecke für meine App (die noch nicht abgeschlossen ist). Soweit ich mich erinnere, war diese Codezeile da, weil andere Warnungen erhalten haben, dass kein Kontext gestartet wurde. – jksoegaard
Entschuldigung, wenn Sie mich missverstanden haben, war es keine negative Rezension, es war als eine Frage gedacht. Ich fragte mich, warum es erforderlich war, welchem Zweck es diente. Ich habe meine eigene kleine UIGestureRecognizer für eine PDFView, und ich kann bestätigen, dass es ohne es funktioniert (habe keine Warnung auf dem Simulator gesehen. Vielleicht auf einem Gerät, ist es anders) –