Cocoa PDFView仅在调整大小时显示PDF

sot*_*pme 6 pdf xcode cocoa objective-c pdfkit

如何让PDFView显示PDF而无需调整窗口大小或进行滚动以强制重绘.

这就好像setNeedsDisplay需要完成,但这没有任何效果.

我有一个最简单的应用程序,我可以想到使用PDFView显示PDF.

基本上在Xcode中创建一个新的应用程序并将代码更改为:

// 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
Run Code Online (Sandbox Code Playgroud)

// 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
Run Code Online (Sandbox Code Playgroud)

我注意到Apple代码示例PDFKitLinker2中的相同行为,其中必须滚动PDF或调整窗口大小以显示PDF.

当然,我是Cocoa开发世界的新手,但我搜索过并发现没有一个很小的例子来展示如何显示PDF.我所生产的内容似乎是正确的,但我怀疑甚至PDFKitLinker2似乎也不正确.

我已经创建了一个Xcode项目的Git仓库,它为那些有时间提供帮助和/或评论的人展示了这个问题.

git clone git@bitbucket.org:sotapme/pdfview_open.git
Run Code Online (Sandbox Code Playgroud)

使用Xcode版本4.3.3(4E3002) - 最新狮友.

在此先感谢您的帮助.


有效的解决方案.


我找到了一个解决方案,如果我创建一个带有空实现的PDFView子类,然后将其添加为自定义视图并将其连接起来,我现有的IBOutlet工作正常.

对我毫无意义:(

//DPPDFView.h
#import <Quartz/Quartz.h>
@interface DPPDFView : PDFView
@end
Run Code Online (Sandbox Code Playgroud)

//DPPDFView.m
#import "DPPDFView.h"
@implementation DPPDFView
@end
Run Code Online (Sandbox Code Playgroud)

Apple的文档确实说:

PDFView可能是您在应用程序中添加PDF功能时唯一需要处理的类.它允许您显示PDF数据,并允许用户选择内容,浏览文档,设置缩放级别,以及将文本内容复制到粘贴板.PDFView还可以跟踪页面历史记录.

您可以将PDFView子类化以创建自定义PDF查看器.

我留下这个问题并自我回答那些可能经过类似问题的人,希望这对他们来说是一个昏暗的光明灯塔; 也希望有更多可可智慧的人会指出我的想法中的错误.

小智 2

我认为这确实是由于在延迟加载完成实际加载 PDF 文档PDFview 需要 setNeedsDisplay 造成的。

一个黑客,但将以下内容添加到您的 - (void)windowDidLoad 方法中至少可以正确显示文档而无需调整大小。

dispatch_async(dispatch_get_main_queue(), ^{
    [self.myPDFView setNeedsDisplay:YES];
});
Run Code Online (Sandbox Code Playgroud)