Вопрос или проблема
расширение 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
. Основная цель состоит в том, чтобы добавить логику, которая будет проверять, перекрывает ли новое выделение уже существующее выделение. Если да, то выделение не будет добавлено.
Шаги по реализации решения:
-
Сбор всех существующих выделений на странице: Для начала нужно получить список всех уже существующих аннотаций типа "выделение" на текущей странице.
-
Проверка наложения: При добавлении нового выделения, необходимо проверить, пересекает ли его область (bounds) с любым из существующих выделений.
-
Добавление нового выделения: Если новое выделение не пересекается с другими, тогда его можно безопасно добавить на страницу.
Модифицированный код:
Ниже приводится обновленная версия метода 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-документами. Не забывайте тестировать изменения, чтобы убедиться, что новая функция работает в различных сценариях использования.