2

I'm building an app to edit PDFs on iPad.

I'm trying to implement the dragging of the annotations with a panGesture recognizer that I added to the superview of the PDFView. The problem is that the new rect bounds of the annotation gets assigned but the changes doesn't reflect on screen.

Here is my code:

@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
    }
}

Hope you can help me.

OscarVGG
  • 2,632
  • 2
  • 27
  • 34
  • HI, do you this sample project. I want to implement the same. Can you please share the Github link with working code? – Nikita Patil Feb 03 '22 at 15:28

3 Answers3

3

Well, Since nobody replied. I think there is a bug in the framework, so I'll post what worked for me, after some time of trial and error.

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

It's not elegant, but it does the job

OscarVGG
  • 2,632
  • 2
  • 27
  • 34
0

Using a Bezierpath the whole bezierpath moves on bounds change.

PDF's builtin line type does not get moved with changing bounds though, so have to set startPoint and endPoint at every change.

Fabian
  • 5,040
  • 2
  • 23
  • 35
0

I added a line to your code so that when dragging, it puts the annotation center where your finger is dragging

    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
    }
}
Rajee Jones
  • 289
  • 2
  • 9