How does one get a PDFView to display a PDF without having to resize the window or doing a scroll to force a redraw.
It's as if a setNeedsDisplay
needs to be done, yet that has no effect.
I've the simplest app I can think of to display a PDF using a PDFView.
Basically create a new app in Xcode and change the code to be:
// AppDelegate.h
#import <Cocoa/Cocoa.h>
#import <Quartz/Quartz.h>
@interface AppDelegate : NSObject <NSApplicationDelegate>
@property (assign) IBOutlet NSWindow *window;
@property (assign) IBOutlet PDFView *pdfView;
@end
and
// AppDelegate.m
#import "AppDelegate.h"
@implementation AppDelegate
@synthesize window = _window;
@synthesize pdfView = _pdfView;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSURL *pdfURL = [[NSBundle mainBundle] URLForResource:@"TestPage" withExtension:@"pdf"];
PDFDocument *document = [[PDFDocument alloc] initWithURL: pdfURL];
self.pdfView.document = document;
}
@end
I've noticed the same behaviour in the Apple code example PDFKitLinker2 where one has to either scroll over the PDF or resize the window to get the PDF to display.
Granted I'm new to the world of Cocoa development but I've searched and found no really small examples that show how to display a PDF. What I've produced would seem to be correct yet I have doubts given that even PDFKitLinker2 doesn't seem to be correct.
I've created a Git repo of an Xcode project that demonstrates the issue for those that have time to help and/or comment.
git clone [email protected]:sotapme/pdfview_open.git
Using Xcode Version 4.3.3 (4E3002) - Latest Lion.
Thanks in advance for any help.
I found a solution whereby if I create a sub class of PDFView with an empty implementation and then add that as a custom view and wire it up my existing IBOutlet
it works.
Makes no sense at all to me :(
//DPPDFView.h
#import <Quartz/Quartz.h>
@interface DPPDFView : PDFView
@end
and
//DPPDFView.m
#import "DPPDFView.h"
@implementation DPPDFView
@end
Apple's docs do say:
PDFView may be the only class you need to deal with for adding PDF functionality to your application. It lets you display PDF data and allows users to select content, navigate through a document, set zoom level, and copy textual content to the Pasteboard. PDFView also keeps track of page history.
You can subclass PDFView to create a custom PDF viewer.
I leave this question and self answer for those that may pass by with similar questions, hoping that it will be a dim beacon of light for them; Also hoping someone with more Cocoa wisdom will point out the error in my thinking.
I figured this is indeed caused by the PDFview needing a setNeedsDisplay after lazyloading has finished actually loading the PDF document.
A hack, but adding the below to your - (void)windowDidLoad method at least displays the document properly without needing a resize.
dispatch_async(dispatch_get_main_queue(), ^{
[self.myPDFView setNeedsDisplay:YES];
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With