5

ウィンドウのサイズを変更したり、スクロールして再描画を強制したりせずに、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プロジェクトのGitリポジトリを作成しました。これは、支援やコメントを行う時間がある人のために問題を示しています。

git clone git@bitbucket.org:sotapme/pdfview_open.git

Xcodeバージョン4.3.3(4E3002)の使用-最新のLion。

助けてくれてありがとう。


動作するソリューション。


空の実装で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ビューアを作成できます。

私はこの質問と自己回答を同様の質問で通り過ぎるかもしれない人々に残し、それが彼らにとって薄暗い光の灯台になることを望んでいます。また、より多くのココアの知恵を持っている人が私の考えの誤りを指摘することを願っています。

4

3 に答える 3

2

これは、遅延読み込みが実際にPDFドキュメントの読み込みを完了した後、PDFviewがsetNeedsDisplayを必要とすることが原因であると考えました。

ハックですが、以下を-(void)windowDidLoadメソッドに追加すると、少なくともサイズ変更を必要とせずにドキュメントが正しく表示されます。

dispatch_async(dispatch_get_main_queue(), ^{
    [self.myPDFView setNeedsDisplay:YES];
});
于 2012-10-26T15:49:29.713 に答える
0

ビューに「WantsCoreAnimation」フラグを設定すると、動作が不安定になることがわかりました。そのセットがある場合は、次を追加してみてください。

[pdfView setLayerContentsRedrawPolicy: NSViewLayerContentsRedrawOnSetNeedsDisplay];
[pdfView setNeedsDisplay: YES];

PDFViewをロードする関数に。

于 2012-06-29T20:25:56.720 に答える
0

これは仮説ですがself.pdfView.document = document;、NIBからのPDFViewがインスタンス化されていないことが原因である可能性があります。

nilオブジェクトにメッセージを渡すときに、Obj-Cはあなたに向かって叫びません。

この仮説をテストするために、それがであるかどうかを確認できNSLog()ます。pdfViewnil

于 2013-04-04T16:05:34.813 に答える