Я хочу добавить функцию, которая предотвращает наложение выделений.

Вопрос или проблема

расширение MainPDFViewModel {
    функция highlightText(в pdfView: PDFView, с цветом: HighlightColors) {
        guard toolMode == .highlight else { return }
        
        guard let currentSelection = pdfView.currentSelection else { return }
        
        let selections = currentSelection.selectionsByLine()
        
        guard let page = selections.first?.pages.first else { return }
        
        let highlightColor = color.uiColor
        
        selections.forEach { selection in
            var bounds = selection.bounds(for: page)
            let originBoundsHeight = bounds.size.height
            bounds.size.height *= 0.6
            bounds.origin.y += (originBoundsHeight - bounds.size.height) / 2
            
            let highlight = PDFAnnotation(bounds: bounds, forType: .highlight, withProperties: nil)
            highlight.endLineStyle = .none
            highlight.color = highlightColor
            page.addAnnotation(highlight)
        }
    }
}

Теперь я могу накладывать выделения в PDF.

Я хочу предотвратить наложение выделений. Если я перетаскиваю, добавляю выделение, кроме уже имеющегося выделенного текста.

Ответ или решение

Для решения задачи предотвращения наложения выделений текста в PDF-документах, предлагаю внести изменения в существующий метод highlightText. Основная цель состоит в том, чтобы добавить логику, которая будет проверять, перекрывает ли новое выделение уже существующее выделение. Если да, то выделение не будет добавлено.

Шаги по реализации решения:

  1. Сбор всех существующих выделений на странице: Для начала нужно получить список всех уже существующих аннотаций типа "выделение" на текущей странице.

  2. Проверка наложения: При добавлении нового выделения, необходимо проверить, пересекает ли его область (bounds) с любым из существующих выделений.

  3. Добавление нового выделения: Если новое выделение не пересекается с другими, тогда его можно безопасно добавить на страницу.

Модифицированный код:

Ниже приводится обновленная версия метода highlightText, уже с добавленной проверкой на пересечение выделений:

extension MainPDFViewModel {
    func highlightText(in pdfView: PDFView, with color: HighlightColors) {
        guard toolMode == .highlight else { return }

        guard let currentSelection = pdfView.currentSelection else { return }

        let selections = currentSelection.selectionsByLine()

        guard let page = selections.first?.pages.first else { return }

        let highlightColor = color.uiColor

        // Получаем все существующие аннотации на странице
        let existingHighlights = page.annotations.filter { $0.type == .highlight }

        selections.forEach { selection in
            var bounds = selection.bounds(for: page)
            let originBoundsHeight = bounds.size.height
            bounds.size.height *= 0.6
            bounds.origin.y += (originBoundsHeight - bounds.size.height) / 2

            let newHighlightBounds = bounds

            // Проверка на перекрытие с существующими аннотациями
            let isOverlapping = existingHighlights.contains { existingHighlight in
                return existingHighlight.bounds.intersects(newHighlightBounds)
            }

            // Если перекрытия нет, то добавляем новое выделение
            if !isOverlapping {
                let highlight = PDFAnnotation(bounds: newHighlightBounds, forType: .highlight, withProperties: nil)
                highlight.endLineStyle = .none
                highlight.color = highlightColor
                page.addAnnotation(highlight)
            }
        }
    }
}

Пояснения по коду:

  • Фильтрация аннотаций: page.annotations.filter { $0.type == .highlight } позволяет нам составить массив существующих выделений на странице. Это важно для сравнения с новым выделением.

  • Проверка наложения: Метод intersects(newHighlightBounds) используется для проверки, пересекается ли новое выделение с уже существующими. Если нет наложения (isOverlapping равно false), то производится добавление нового выделения.

Заключение:

Добавив эту логику в метод highlightText, вы обеспечите пользователя возможностью выделять текст без создания нежелательных перекрытий, что значительно улучшит опыт работы с PDF-документами. Не забывайте тестировать изменения, чтобы убедиться, что новая функция работает в различных сценариях использования.

Оцените материал
Добавить комментарий

Капча загружается...