パネルではなくビューにファイルのプレビューを表示しようとしています。私が見つけたすべての例は約QLPreviewPanel
です。:(
よろしくお願いします。
パネルではなくビューにファイルのプレビューを表示しようとしています。私が見つけたすべての例は約QLPreviewPanel
です。:(
よろしくお願いします。
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
です。関数が最善の方法かもしれないと思います。カテゴリはあなたの生活を少し楽にするかもしれません。
私はこれでいくらか前進しました。サブレイヤーの内容はゼロでした。しかし、昔ながらのサブビューは機能します。
[[[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によって提案されたより深刻なハックを試してみます。
OS X 10.7以降、このためのパブリックAPIがあります。QLPreviewView.hは、QuickLookUIフレームワーク(Quartzフレームワークの一部)の一部です。ドキュメントはないようですが、ヘッダーファイルにはいくつかの基本的な情報が含まれています。