iOS 11 PDFKit не обновляет позицию аннотации

Я создаю приложение для редактирования PDF-файлов на iPad.

Я пытаюсь реализовать перетаскивание аннотаций с помощью распознавателя panGesture, который я добавил в супервизор PDFView. Проблема в том, что новые прямоугольные границы аннотации назначаются, но изменения не отражаются на экране.

Вот мой код:

@objc func handlePanGesture(panGesture: UIPanGestureRecognizer) {
    let touchLocation = panGesture.location(in: pdfView)

    guard let page = pdfView.page(for: touchLocation, nearest: true) else {
        return
    }
    let locationOnPage = pdfView.convert(touchLocation, to: page)

    switch panGesture.state {
    case .began:

           guard let annotation = page.annotation(at: locationOnPage) else {
                return
            }
            currentlySelectedAnnotation = annotation
    case .changed:

        guard let annotation = currentlySelectedAnnotation else {
            return
        }
        let initialBounds = annotation.bounds
        annotation.bounds = CGRect(origin: locationOnPage,
                                   size: initialBounds.size)

        print("move to \(locationOnPage)")
    case .ended, .cancelled, .failed:
        break
    default:
        break
    }
}

Надеюсь, вы можете мне помочь.


person OscarVGG    schedule 13.10.2017    source источник


Ответы (3)


Ну, так как никто не ответил. Я думаю, что в структуре есть ошибка, поэтому я опубликую то, что сработало для меня, после некоторого времени проб и ошибок.

let initialBounds = annotation.bounds
annotation.bounds = CGRect(
        origin: locationOnPage,
        size: initialBounds.size)
page.removeAnnotation(annotation)
page.addAnnotation(annotation)

Это не элегантно, но это делает работу

person OscarVGG    schedule 24.10.2017
comment
Можете ли вы показать, где вы добавили распознаватель? Мне нужно сделать то же самое, но у меня ничего не работает. Мой pdfView не получает жест - person Rajee Jones; 13.03.2018
comment
Вы должны добавить его в представление за pdfView - person OscarVGG; 20.03.2018

Используя Bezierpath, весь Bezierpath перемещается при изменении границ.

Однако встроенный тип линии PDF не перемещается при изменении границ, поэтому необходимо устанавливать startPoint и endPoint при каждом изменении.

person Fabian    schedule 22.12.2017

Я добавил в ваш код строку, чтобы при перетаскивании он помещал центр аннотации туда, куда вы перетаскиваете палец

    case .changed:

        guard let annotation = currentlySelectedAnnotation else {
            return
        }
        let initialBounds = annotation.bounds
        // Set the center of the annotation to the spot of our finger
        annotation.bounds = CGRect(x: locationOnPage.x - (initialBounds.width / 2), y: locationOnPage.y - (initialBounds.height / 2), width: initialBounds.width, height: initialBounds.height)


        print("move to \(locationOnPage)")
    case .ended, .cancelled, .failed:
        currentlySelectedAnnotation = nil
    default:
        break
    }
}
person Rajee Jones    schedule 16.03.2018