добавить разные линии подсветки к одной и той же аннотации.

ользую PDFKit на iOS для выделения текста (файл PDF). Я делаю это, создав PDF-аннотацию и добавив ее в выделенную текстовую область. Я хочу выделить выделенную область точно, но она всегда покрывает всю линию, как на картинках ниже. Как я могу создать аннотацию только для выбранной области?

Мой код:

        let highlight = PDFAnnotation(bounds: selectionText.bounds(for: page), forType: PDFAnnotationSubtype.highlight, withProperties: nil)
        highlight.color = highlightColor
        page.addAnnotation(highlight)

Ответы на вопрос(2)

Как предложено вPDFKit Highlight Аннотация: четырехугольные точки вы можете использоватьquadrilateralPoints добавить разные линии подсветки к одной и той же аннотации.

func highlight() {  
    guard let selection = pdfView.currentSelection, let currentPage = pdfView.currentPage else {return}
    let selectionBounds = selection.bounds(for: currentPage)
    let lineSelections = selection.selectionsByLine()

    let highlightAnnotation = PDFAnnotation(bounds: selectionBounds, forType: PDFAnnotationSubtype.highlight, withProperties: nil)

    highlightAnnotation.quadrilateralPoints = [NSValue]()
    for (index, lineSelection) in lineSelections.enumerated() {
        let n = index * 4
        let bounds = lineSelection.bounds(for: pdfView.currentPage!)
        let convertedBounds = bounds.convert(to: selectionBounds.origin)
        highlightAnnotation.quadrilateralPoints?.insert(NSValue(cgPoint: convertedBounds.topLeft), at: 0 + n)
        highlightAnnotation.quadrilateralPoints?.insert(NSValue(cgPoint: convertedBounds.topRight), at: 1 + n)
        highlightAnnotation.quadrilateralPoints?.insert(NSValue(cgPoint: convertedBounds.bottomLeft), at: 2 + n)
        highlightAnnotation.quadrilateralPoints?.insert(NSValue(cgPoint: convertedBounds.bottomRight), at: 3 + n)
    }

    pdfView.currentPage?.addAnnotation(highlightAnnotation)
}

extension CGRect {

    var topLeft: CGPoint {
        get {
            return CGPoint(x: self.origin.x, y: self.origin.y + self.height)
        }
    }

    var topRight: CGPoint {
        get {
            return CGPoint(x: self.origin.x + self.width, y: self.origin.y + self.height)
        }
    }

    var bottomLeft: CGPoint {
        get {
            return CGPoint(x: self.origin.x, y: self.origin.y)
        }
    }

    func convert(to origin: CGPoint) -> CGRect {
        return CGRect(x: self.origin.x - origin.x, y: self.origin.y - origin.y, width: self.width, height: self.height)
    }
}
Решение Вопроса

PDFSelection bounds(forPage:) Метод возвращает один прямоугольник, чтобы удовлетворить всю область выделения. Это не лучшее решение в вашем случае.

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

    let selections = pdfView.currentSelection?.selectionsByLine()
    // 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)
    })

Ваш ответ на вопрос