1

パネルではなくビューにファイルのプレビューを表示しようとしています。私が見つけたすべての例は約QLPreviewPanelです。:(

よろしくお願いします。

4

3 に答える 3

1

Appleは本当にQLPreviewPanelあなたに;を使って欲しいようです。私が見る唯一の可能性は、パネルをレイヤーバックに設定し、正しいサブレイヤーのコンテンツを取得することによって、プレビューを「スクレイピング」することです。このようなもの(私はそれを機能させることができていませんが):

[[[QLPreviewPanel sharedPreviewPanel] contentView] setWantsLayer:YES];
[[QLPreviewPanel sharedPreviewPanel] makeKeyAndOrderFront:nil];
NSLog(@"layer: %@", [[[QLPreviewPanel sharedPreviewPanel] contentView] layer]);
// I believe there are two sublayers
id QLcontents = [[[[[[QLPreviewPanel sharedPreviewPanel] contentView] layer] sublayers] objectAtIndex:0] contents];
NSLog(@"contents: %@", QLcontents);
[myView layer].contents = QLcontents;
[myView layer] setNeedsDisplay];

決して最終的な解決策ではありませんが(これはそのままでは機能しません)、おそらくそれはあなたを有用な方向に導くでしょう。

更新NSImage:を使用するMatt Gemmellという名前の仲間によって書かれた、のカテゴリに偶然出くわしましたQLThumbnailImageCreate彼のソースコードページで「NSImage+QuickLook」を探してください。彼は、QuickLookPanelが実際にを使用していることを示唆しているようQLThumbnailImageCreateです。関数が最善の方法かもしれないと思います。カテゴリはあなたの生活を少し楽にするかもしれません。

于 2011-03-24T22:11:32.827 に答える
1

私はこれでいくらか前進しました。サブレイヤーの内容はゼロでした。しかし、昔ながらのサブビューは機能します。

[[[QLPreviewPanel sharedPreviewPanel] contentView] setWantsLayer:YES];
[[QLPreviewPanel sharedPreviewPanel] makeKeyAndOrderFront:nil];
NSArray* subviews = [[[QLPreviewPanel sharedPreviewPanel] contentView] subviews] ;
for (id subview in subviews) {
    // The first view is the one we want, which is an unsubclassed NSView.
    // The second is a QLPreviewTitleBarView.  However, instead of relying
    // on that order, we check for the class.
    if ([subview isMemberOfClass:[NSView class]]) {
        NSLog(@"frame of subview: %@", NSStringFromRect([subview frame])) ;
        // The following statement will *remove* the desired subview from
        // the QLPreviewPane and place it into myWindow instead.
        [[myWindow contentView] addSubview:subview];
        break ;
    }
}

-reloadDataをQLPreviewPaneに送信すると、myWindowが更新されるようです。ぬるぬるしている。しかし、次に何をすべきかわからない。1つの問題は、サブビューの任意のサイズを処理することです。QLPreviewPaneが気に入らない理由の1つは、ウィンドウサイズを制御できないことです。ジェネレータから任意のサイズのビューを取得し、画面に表示します。私はそれをスクロールビューに入れることができたと思います。もう1つの問題は、まだ画面に表示されているQLPreviewPanelをどのように処理するかです。フレームの原点をオフスクリーンに設定しているかもしれませんが、今すぐ別のタスクに取り組む必要があります。それ以上のアイデアをいただければ幸いです。

後で。 このアプローチは問題になると思います。まず、 setFrameOrigin:NSMakePoint(10000、10000)を送信して、QLPreviewPaneウィンドウを削除しようとしました。結果:[QL]アサーションの失敗([イベントウィンドウ] ==ウィンドウ)-イベントのウィンドウが間違っています。次に、-makeKeyAndOrderFront:の呼び出しを省略し、代わりに-reloadDataまでスキップしようとしました。結果:[QL] QLError():-[QLPreviewPanel reloadData]がパネルにコントローラーがないときに呼び出されました-これを修正しないと、すぐに発生します。-acceptsPreviewPanelControl:/-beginPreviewPanelControl:/-endPreviewPanelControl:については、QLPreviewPanel.hのコメントを参照してください。

2番目のエラーは理解できますが、QLPreviewPanelは、キーになるか最前線で注文されるまで、データソースを検索しようとしないことを示しています。ただし、最初の主張は、プレビューデータを直接取得するための適切なAPIを提供していないことに加えて、Appleが私のようなカジュアルなハッカーのためにいくつかの罠を仕掛けていることを示しています。

これに戻ったら、次回はKenApeslaghによって提案されたより深刻なハックを試してみます。

于 2012-01-19T19:10:01.103 に答える
1

OS X 10.7以降、このためのパブリックAPIがあります。QLPreviewView.hは、QuickLookUIフレームワーク(Quartzフレームワークの一部)の一部です。ドキュメントはないようですが、ヘッダーファイルにはいくつかの基本的な情報が含まれています。

于 2012-07-24T21:55:03.073 に答える