PDFView не выделяет результаты поиска

Я пробую PDFView и хочу выделить искомые слова. Я следовал этому небольшому уроку прямо здесь (см. Пункт поиска).

Я получаю совпадения для моего PDF, но когда я установил pdfView.highlightedSelections = searchedItems Ничего не произошло.

Вот мой код (VC расширяет PDFDocumentDelegate)

var document: PDFDocument!
var searchedItems: [PDFSelection] = []


override func viewDidLoad() {
    super.viewDidLoad()

    let url = Bundle.main.url(forResource: "test3", withExtension: "pdf")
    document = PDFDocument(url: url!)
    pdfView.document = document
    pdfView.document?.delegate = self
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    pdfView.document?.findString("Product", withOptions: .caseInsensitive)
}

func documentDidEndDocumentFind(_ notification: Notification) {
    pdfView.highlightedSelections = nil
    pdfView.highlightedSelections = searchedItems
}

func documentDidFindMatch(_ notification: Notification) {
    if let selection = notification.userInfo?.first?.value as? PDFSelection {
        selection.color = .yellow
        searchedItems.append(selection)
        print("didFindMatch")
    }
}

3 ответа

Решение

Хорошо, я понял это для себя, прочитав эту ветку здесь: https://forums.developer.apple.com/thread/93414

Кажется, что highlightedSelections не работает как задокументировано. Я сообщу об ошибке в Apple.

PDFSelection сам по себе имеет внутренний массив типа PDFSelection, При этом я могу добавить несколько вариантов выбора внутри одного. После этого я могу использовать pdfView.setCurrentSelection(_:animate:) установить этот вложенный массив выбора.

var document: PDFDocument!
var searchedItem: PDFSelection?

override func viewDidLoad() {
    super.viewDidLoad()

    let url = Bundle.main.url(forResource: "test3", withExtension: "pdf")
    document = PDFDocument(url: url!)
    pdfView.document = document
    pdfView.document?.delegate = self
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
        self.document?.beginFindString("Product", withOptions: .caseInsensitive)        
}

func documentDidEndDocumentFind(_ notification: Notification) {
    pdfView.setCurrentSelection(searchedItem, animate: true)
}

func documentDidFindMatch(_ notification: Notification) {
    if let selection = notification.userInfo?.first?.value as? PDFSelection {
        selection.color = .yellow
        if searchedItem == nil {
            // The first found item sets the object.
            searchedItem = selection
        } else {
            // All other found selection will be nested
            searchedItem!.add(selection)
        }
    }
}

Расширяя ответ Рафаля, я заставил его работать даже с многостраничными документами (и несколькими поисковыми терминами), вот так. То, что я еще не смог проверить, будет ли это работать с термином, охватывающим несколько страниц:

   private func highlight(searchTerms: [String]?)
   {
      searchTerms?.forEach { term in
         let selections = pdfView?.document?.findString(term, withOptions: [.caseInsensitive])

         selections?.forEach { selection in
            selection.pages.forEach { page in
               let highlight = PDFAnnotation(bounds: selection.bounds(for: page), forType: .highlight, withProperties: nil)
               highlight.endLineStyle = .square
               highlight.color = UIColor.orange.withAlphaComponent(0.5)

               page.addAnnotation(highlight)
            }
         }
      }
   }

Единственное решение, которое сработало для меня, это PDFAnnotation с .highlight тип:

let selections = pdfView?.document?.findString("PDFKit, my dear!", withOptions: [.caseInsensitive])
// Simple scenario, assuming your pdf is single-page.
guard let page = selections?.first?.pages.first else { return }

selections?.forEach({ selection in
    let highlight = PDFAnnotation(bounds: selection.bounds(for: page), forType: .highlight, withProperties: nil)
    highlight.endLineStyle = .square
    highlight.color = UIColor.orange.withAlphaComponent(0.5)

    page.addAnnotation(highlight)
})

Вам нужно добавить свои экземпляры в highlightedSelections

func viewDidLoad() {
    super.viewDidLoad()

    //load your pdf ...
    //...

    self.youPdfView?.document.delegate = self
    self.yourPdfView?.highlightedSelections = [PDFSelection]()
    self.yourPdfView?.document?.beginFindString("foo", withOptions: .caseInsensitive)

}

func didMatchString(_ instance: PDFSelection) {
    instance.color = .yellow
    self.pdfView?.highlightedSelections?.append(instance)
}
Другие вопросы по тегам