如何让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
和
// 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
我注意到Apple代码示例PDFKitLinker2中的相同行为,其中必须滚动PDF或调整窗口大小以显示PDF。
当然,我是Cocoa开发世界的新手,但我搜索过并发现没有显示如何显示PDF的小例子。我生产的内容似乎是正确的,但我怀疑,即使 PDFKitLinker2 似乎也不正确。
我为那些有时间提供帮助和/或评论的人创建了Xcode project that demonstrates the issue的Git回购。
git clone git@bitbucket.org:sotapme/pdfview_open.git
使用Xcode版本4.3.3(4E3002) - 最新狮友。
提前感谢您的帮助。
我找到了一个解决方案,如果我创建一个带有空实现的PDFView子类,然后将其添加为自定义视图并将其连接起来,我现有的IBOutlet
就可以了。
对我毫无意义:(
//DPPDFView.h
#import <Quartz/Quartz.h>
@interface DPPDFView : PDFView
@end
和
//DPPDFView.m
#import "DPPDFView.h"
@implementation DPPDFView
@end
Apple的文档确实说:
PDFView可能是您在应用程序中添加PDF功能时唯一需要处理的类。它允许您显示PDF数据,并允许用户选择内容,浏览文档,设置缩放级别,以及将文本内容复制到粘贴板。 PDFView还可以跟踪页面历史记录。
您可以将PDFView子类化以创建自定义PDF查看器。
我留下这个问题并自我回答那些可能会遇到类似问题的人,希望这对他们来说是光明的灯塔;也希望有更多Cocoa智慧的人会指出我的想法中的错误。
答案 0 :(得分:1)
我认为这确实是由于在延迟加载完成实际加载PDF文档后需要setNeedsDisplay 的PDFview引起的。
一个hack,但是将以下内容添加到你的 - (void)windowDidLoad方法中,至少可以正确显示文档而无需调整大小。
dispatch_async(dispatch_get_main_queue(), ^{
[self.myPDFView setNeedsDisplay:YES];
});
答案 1 :(得分:0)
我发现在视图中设置“Wants Core Animation”标志会导致一些不稳定的行为。如果您有该设置,请尝试添加:
[pdfView setLayerContentsRedrawPolicy: NSViewLayerContentsRedrawOnSetNeedsDisplay];
[pdfView setNeedsDisplay: YES];
加载PDFView的函数。
答案 2 :(得分:0)
这是一个假设,但可能是因为当您self.pdfView.document = document;
时,NIB中的PDFView尚未实例化!
当您将消息传递给nil
对象时,Obj-C不会对您大喊大叫。
要测试此假设,您可以NSLog()
pdfView
nil
查看是否{{1}}。