Удаление аннотации выделения с помощью PDFKit - PullRequest
0 голосов
/ 30 октября 2019

Я успешно добавляю аннотацию выделения в pdf, используя swift и PDFKit, но я не могу понять, как позволить пользователю снова удалить выделение.

Пользователь может выбрать текст в обычном режиме, изатем выберите «Выделение» или «Удалить выделение» из UIMenu.

Чтобы настроить pdfView при выделении текста, я изменил появившееся меню - сначала удалив действия по умолчанию:

extension PDFView {
    override public func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return false
    }
}

Затем в viewDidLoad () я установил свои пользовательские UIMenuItems:

let menuItem1 = UIMenuItem(title: "Highlight", action: #selector(highlightSelection(_:)))        
let menuItem2 = UIMenuItem(title: "Remove highlight", action: #selector(removeHighlightSelection(_:)))
UIMenuController.shared.menuItems = [menuItem1, menuItem2]

При выборе выделения:

@objc func highlightSelection(_ sender: UIMenuItem) {
            let selections = pdfViewer.currentSelection?.selectionsByLine()
            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.color = .yellow
                page.addAnnotation(highlight)
            })
    }

Пока все хорошо - все работает нормально до этого момента. Текст подсвечивается и создается аннотация.

Теперь возникает моя проблема:

Когда я выделяю выделенный текст, я хочу, чтобы пользователь мог удалить аннотацию выделения, нажав «Удалить выделение», ноЯ просто не могу понять, как удалить только аннотацию, которая скрывается «за» выделенным текстом.

Этот код работает, но удаляет все аннотации на всей странице:

@objc func removeHighlightSelection(_ sender: UIMenuItem) {
        let selections = pdfViewer.currentSelection?.selectionsByLine()
        guard let page = selections?.first?.pages.first else { return }

        let annotationsToRemove = page.annotations

        for annotation in annotationsToRemove {
            page.removeAnnotation(annotation)
            print("Removed: \(annotation)")
        }
    }

Таккак удалить только выделенную аннотацию выделения?

Кстати - я знаю, что все меню не очень актуально, но я надеюсь, что кто-нибудь найдет этот вопрос при работе с аннотациями выделения, а затембыть в состоянии использовать эту часть.

Спасибо, Эмиль.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Хорошо, я на самом деле понял это через некоторое время.

Я решил следующий подход, который работает для удаления выделенных аннотаций:

1: Получить все аннотации на странице.

2: Определить, какие аннотации являются частью текущего выделения , проверив, находится ли bounds.origin аннотации в пределах границ выделения.

3: Проверить, если выбраноаннотации имеют тип «Выделить» и удаляют только эти.

4: Удалите аннотацию (и).

5: Не забудьте сохранить изменения в некоторыхбалл.

//Remove highlight annotations that are part of the current selection.
@objc func removeHighlightSelection(_ sender: UIMenuItem) {
    let selection = PDFSelection.init(document: pdfViewer.document!)
    selection.add(pdfViewer.currentSelection!)
    let selectionBounds = selection.bounds(for: pdfViewer.currentPage!)
    let annotations = pdfViewer.currentPage?.annotations
    let annotationsToDelete = NSMutableArray()

    for annotation in annotations! {
        let annotationPoint = annotation.bounds.origin
        if selectionBounds.contains(annotationPoint) {
            annotationsToDelete.add(annotation)
            print(annotationsToDelete)
        }
    }

    for annotation in annotationsToDelete {
        let onlyHighlight = annotation as! PDFAnnotation
        if onlyHighlight.type == "Highlight" {
            pdfViewer.currentPage?.removeAnnotation(onlyHighlight)
            print("Removed highlight annotation: \(onlyHighlight)")
        }
    }
}
0 голосов
/ 30 октября 2019

соблюдайте это уведомление: PDFViewAnnotationHitNotification здесь: https://developer.apple.com/documentation/foundation/nsnotification/name/1504809-pdfviewannotationhit

добавьте цель в прослушиватель уведомлений

при нажатии аннотации верните значение словаря из userInfo для PDFViewAnnotationHitNotification для "PDFAnnotationHit"и у вас будет точная аннотация, которая была нажата, как только у вас будет эта аннотация, удалите ее.

...