2017-09-29 16 views
7

Próbuję dodać uwagę adnotacje do dokumentów za pomocą PDFKit na iOS.PdfKit wyróżnij adnotację

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

highlight.color = color 

page.addAnnotation(highlight) 
page.displaysAnnotations = true 

Dodając je za pomocą powyższego kodu, pojawiają się one jako dwie warstwy o różnych kształtach. Zapisując je do pliku PDF i ponownie otwierając, wyświetlają się poprawnie.

W this screen capture

enter image description here

Górne i dolne podkreśla zostały dodane w ten sam sposób, używając fragment zawartych tutaj. Górna została zapisana do dokumentu PDF i pojawia się zgodnie z oczekiwaniami po ponownym otwarciu, dolna została właśnie dodana.

Czy ktoś wie, jak je poprawnie wyświetlić (tj. Jak górny) bez uciekania się do zapisywania i ponownego otwierania pliku?

+0

Mamy dokładnie ten sam problem –

+0

Zalogowałem błąd z Apple i proponuję zrobić to samo https://openradar.appspot.com/34784917. Możesz zgłosić błąd na https://bugreport.apple.com –

+0

Otworzyłem błąd również poprzez bugreport.apple.com, brak odpowiedzi do tej pory. – guco

Odpowiedz

1

To jest znany błąd w 10.13. Istnieje obejście przewijając stronę z dala, a następnie z powrotem do podświetlenia

Można utworzyć zaznaczenie przy użyciu tego kodu:

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) 

Następnie trzeba przejść od strony iz powrotem do podświetlenia

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)) 
    } 
} 

Response od Apple:

Nie ma rozwiązania alternatywnego poza opisanym przez nich "hack": przewijanie od tego miejsca jest z powrotem najlepszą opcją. Zmiana współczynnika powiększenia i odwrócenie może to naprawić w ten sam sposób, ale nie jest gwarantowany.

+0

Zostało to naprawione w macOS 10.13.2 –

1

Skończyło się na tej metodzie hack, która bierze pod uwagę wszystkie przypadki moim zdaniem. Mam nadzieję, że to pomoże.

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) 
    } 
}