2017-09-29 5 views
7

Ich versuche Highlight-Anmerkungen zu Dokumenten mit PDFKit auf iOS hinzuzufügen.PdfKit Highlight Annotation

let highlight = PDFAnnotation(bounds: selection.bounds(for: page), 
           forType: PDFAnnotationSubtype.highlight, 
           withProperties: nil) 

highlight.color = color 

page.addAnnotation(highlight) 
page.displaysAnnotations = true 

Wenn Sie sie mit dem obigen Code hinzufügen, erscheinen sie als zwei unterschiedlich geformte Ebenen. Wenn sie in der PDF-Datei gespeichert und erneut geöffnet werden, werden sie korrekt angezeigt.

In this screen capture

enter image description here

Die oberen und unteren Highlights haben hier die gleiche Art und Weise mit dem Snippet hinzugefügt. Der oberste wurde im PDF-Dokument gespeichert und erscheint beim erneuten Öffnen wie erwartet, der letzte wurde gerade hinzugefügt.

Weiß jemand, wie man sie richtig anzeigen lässt (d. H. Wie die oberste), ohne die Datei erneut speichern und öffnen zu müssen?

+0

Wir haben genau das gleiche Problem –

+0

ich einen Fehler mit Apple angemeldet und ich schlage vor, Sie die gleiche https://openradar.appspot.com/34784917 tun. Sie können einen Fehler unter https://bugreport.apple.com melden. –

+0

Ich habe einen Bug über bugreport.apple.com geöffnet, bisher keine Antworten. – guco

Antwort

1

Das ist also ein bekannter Fehler in 10.13. Es gibt eine Abhilfe, indem Sie die Seite weg scrollen und dann zurück zum Highlight

Sie das Highlight erstellen können diesen Code verwenden:

let page = self.pdfDocument?.page(at: 10) 
let bounds = CGRect(x: 85.8660965, y: 786.8891167, width: 298.41, height: 12.1485) 
let annotation = PDFAnnotation(bounds: bounds, forType: .highlight, withProperties: nil) 
annotation.color = NSColor.blue 
page?.addAnnotation(annotation) 

Dann müssen Sie blättern von der Seite entfernt und zurück zum Highlight

func annotationScrollHack(page: PDFPage) { 
    guard let pdfDocument = self.pdfDocument else { return } 

    //When adding highlights to macOS 10.13 it seems like 2 highlights are added. 
    //If you scroll to a different page and back the "extra" highlight is removed 
    //This function scrolls to the first/last page in the book and then back to the current page 
    //rdar://34784917 
    let bookScrollView = self.pdfView.documentView?.enclosingScrollView 
    let currentVisibleRect = bookScrollView?.contentView.documentVisibleRect 
    if (0 ... 3).contains(pdfDocument.index(for: page)) { 
     if self.pdfView.canGoToLastPage { 
      self.pdfView.goToLastPage(self) 
     } 
    } else { 
     if self.pdfView.canGoToFirstPage { 
      self.pdfView.goToFirstPage(self) 
     } 
    } 

    if let currentVisibleRect = currentVisibleRect { 
     bookScrollView?.contentView.scroll(to: CGPoint(x: currentVisibleRect.origin.x, y: currentVisibleRect.origin.y)) 
    } 
} 

Antwort von Apple:

Es gibt keine andere Problemumgehung als den beschriebenen "Hack": Scrollen weg dann zurück ist die beste Option. Ändern des Zoom-Faktor und Zurücksetzen es könnte es auf die gleiche Weise beheben, aber nicht garantiert.

+0

Dies wurde in macOS 10.13.2 behoben –

1

Ich bin mit dieser Hack-Methode gelandet, die alle Fälle meiner Meinung nach berücksichtigt. Hoffe das wird helfen.

private func hackScroll(to page: PDFPage) { 

    switch (pdfView.canGoToFirstPage(), pdfView.canGoToLastPage()) { 
    case (true, false): 
     pdfView.goToFirstPage(nil) 
     pdfView.go(to: page) 
    case (false, true): 
     pdfView.goToLastPage(nil) 
     pdfView.go(to: page) 
    case (false, false): 
     guard let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return } 
     let file = "temp.pdf" 

     /// Save to temp file 
     let fileURL = dir.appendingPathComponent(file) 
     pdfView.document?.write(to: fileURL) 

     /// Read from temp file 
     guard let document = PDFDocument(url: fileURL) else { return } 
     pdfView.document = document 
     pdfView.autoScales = true 
    default: 
     pdfView.goToFirstPage(nil) 
     pdfView.go(to: page) 
    } 
}