Как раскрасить аннотацию ссылки или добавить действие для выделения аннотации с помощью PDFKit в swift

#xcode10 #ios12 #swift4.2 #ios-pdfkit

#xcode10 #ios12 #swift4.2 #ios-pdfkit

Вопрос:

В моем приложении есть несколько PDF-файлов, и я использую PDFKit в swift. Теперь я хочу выделить все гиперссылки в документе pdf. Я пытался использовать PDFAnnotationSubtype.highlight и PDFAnnotationSubtype.link, но в обоих случаях я не смог достичь своей цели.

Для PDFAnnotationSubtype.highlight — при нажатии на ссылки я не смог добавить к ней действие.

Для PDFAnnotationSubtype.link — я не смог установить цвет или цвет фона для ссылок.

Вот мой код, пожалуйста, поправьте меня, если я чего-то здесь не хватает.

 //here i get my pdf from document directory
let filePAth = (self.getDirectoryPath() as NSString).appendingPathComponent(webURLString)
    let fileURL = URL(fileURLWithPath: filePAth)

    let document = PDFDocument(url: fileURL)

    self.pdfView.displayMode = .twoUpContinuous
    self.pdfView.displayDirection = .horizontal
     pdfView.usePageViewController(true, withViewOptions: [UIPageViewController.OptionsKey.interPageSpacing: 0])

    //here is the hack 
    //i am getting annotation  
   let count = document?.pageCount

    for i in 0 ..< count! {

        let page = document?.page(at: i)
        let annotationArray = page1?.annotations

      for annotationObj in annotationArray! {
            if annotationObj.type! == "Link" {

                //case 1: highlights hyperlinks links but
                //added action does not work
                let annotation = PDFAnnotation(bounds: obj.bounds, forType: PDFAnnotationSubtype.highlight, withProperties: nil)

                annotation.color = UIColor.red
                annotation.isHighlighted = true

                // highlights all the hyperlinks with red color
                // but added action does not work here

                let url = URL(string: "http://google.com/")
                annotation.action = PDFActionURL(url: url!)

               page?.addAnnotation(annotation)

             //case 2: does not highlights hyperlinks links with red 
             //color but added action works

                let annotation = PDFAnnotation(bounds: obj.bounds, forType: PDFAnnotationSubtype.link, withProperties: nil)
                // no effect 
                annotation.color = UIColor.red
                annotation.isHighlighted = true

                // does not highlight all the hyperlinks with red 
                // but added action works here

                let url = URL(string: "http://google.com/")
                annotation.action = PDFActionURL(url: url!)

               page?.addAnnotation(annotation)

            }
        }
    }
  

Я могу найти способ. кто-нибудь может что-нибудь предложить?
Изображение является результатом случая 1, упомянутого в коде.
введите описание изображения здесь

Ответ №1:

Даже это неправильное решение, хотя это и взлом.

Шаг 1 — Создайте аннотацию ссылки и добавьте существующее действие аннотации к новой аннотации ссылки.

 let linkAnnotation = PDFAnnotation(bounds: obj.bounds, forType: PDFAnnotationSubtype.link, withProperties: nil)
linkAnnotation.action = obj.annotation
  

Шаг 2 — Добавьте новую аннотацию ссылки на страницу после выделенной вами аннотации.

 page?.addAnnotation(linkAnnotation)
  

Попробуйте и дайте мне знать, работает ли это у вас.

Ответ №2:

Вам не нужно добавлять какое-либо действие к аннотации, вы можете получить его бесплатно, добавив notification observe, потому что PDFKit отправит уведомление с именем ‘PDFViewAnnotationHit’ при нажатии на аннотацию. Вот документация Apple

 func addAnnotationNotification() {
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(annotationHit(notification:)),
        name: Notification.Name.PDFViewAnnotationHit, object: nil
    )
}

@objc func annotationHit(notification: Notification) {
    if let annotation = notification.userInfo?["PDFAnnotationHit"] as? PDFAnnotation {
        print(annotation.bounds)
        print(annotation.contents!)
    }
}