Question

I'm implementing a PDF viewer on the Mac and I want to let the user add annotations.

I've added a PDFAnnotationText to the page, and it appears just fine, but when the user clicks on it, the whole document is shrunk and an annotation list appears down the left side.

I want to customize this to display the annotation as a pop-up, similar to what Preview does. The PDFAnnotationText class reference says I can do this:

Each PDFAnnotationText object has a PDFAnnotationPopup object associated with it. In its closed state, the annotation appears as an icon. In its open state, it displays as a pop-up window containing the text of the note. Note that your application must do the work to put up a window containing the text in response to a PDFViewAnnotationHitNotification.

But when I add an observer for PDFViewAnnotationHitNotification, no notification is delivered when I click on the annotation.

Was it helpful?

Solution

I've contacted Apple about this, and the answer I received back was that it's a bug. A workaround is to handle the mouse click yourself, walk the annotations and look for a hit.

Something like this (code which runs in a mouseDown handler in a PDFView subclass):

NSPoint windowPoint = [self.window convertScreenToBase:[NSEvent mouseLocation]];
NSPoint viewPoint = [self convertPoint:windowPoint fromView:nil];
PDFPage *page = [self pageForPoint:viewPoint nearest:NO];

if (page != nil) {
    NSPoint pointOnPage = [self convertPoint:viewPoint toPage:page];

    for (PDFAnnotation *annotation in page.annotations) {
        NSRect      annotationBounds;

        // Hit test annotation.
        annotationBounds = [annotation bounds];
        if (NSPointInRect(pointOnPage, annotationBounds))
        {
            NSLog(@"Annotation hit: %@", annotation);
        }
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top